Author: rich
Date: Mon Dec  6 16:11:44 2004
New Revision: 110053

URL: http://svn.apache.org/viewcvs?view=rev&rev=110053
Log:
- Exception-handling cleanup and refactoring before Shared Flow work.
- Added SessionExpiredException, which is thrown *in place of* other exceptions 
that allow it, when the ultimate reason is (probably) session expiration.  This 
is enabled/disabled by the throw-session-expired-exception flag within 
pageflow-config in netui-config.xml.

DRT/BVT: netui (WinXP)
BB: self (linux)


Removed:
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/DeferredPageFlowException.java
Modified:
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/ActionNotFoundException.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleFormPostException.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/EmptyNestingStackException.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/FlowController.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/Forward.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/ForwardHandler.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/IllegalActionOutputException.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/IllegalOutputFormException.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/InfiniteReturnToActionException.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/LoginExpiredException.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/MismatchedActionOutputException.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/MissingActionOutputException.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NoCurrentPageFlowException.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NoMatchingActionMethodException.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NotLoggedInException.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowException.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowUtils.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/UnfulfilledRolesException.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/UnresolvableForwardException.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/handler/ExceptionsHandler.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/DefaultExceptionsHandler.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/InternalUtils.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/RequestValues.java
   
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/ReturnToException.java
   
incubator/beehive/trunk/netui/src/scoping/org/apache/beehive/netui/pageflow/scoping/internal/ScopedRequestImpl.java
   
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties
   incubator/beehive/trunk/netui/src/util/schema/netui-config.xsd
   
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/MockPortalListenTo.xml

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/ActionNotFoundException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/ActionNotFoundException.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/ActionNotFoundException.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/ActionNotFoundException.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/ActionNotFoundException.java
   (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/ActionNotFoundException.java
   Mon Dec  6 16:11:44 2004
@@ -47,4 +47,9 @@
     {
         return _form;
     }
+
+    public boolean causeMayBeSessionExpiration()
+    {
+        return false;
+    }
 }

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleFormPostException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleFormPostException.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleFormPostException.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleFormPostException.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleFormPostException.java
   (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/DoubleFormPostException.java
   Mon Dec  6 16:11:44 2004
@@ -17,18 +17,18 @@
  */
 package org.apache.beehive.netui.pageflow;
 
-import org.apache.beehive.netui.pageflow.internal.DeferredPageFlowException;
-
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 
 public class DoubleFormPostException
-        extends DeferredPageFlowException
+        extends PageFlowException
+        implements ResponseErrorCodeSender
 {
-    public DoubleFormPostException( String actionName )
+    DoubleFormPostException( String actionName, FlowController fc )
     {
-        super( actionName );
+        super( actionName, fc );
     }
-    
+
     protected Object[] getMessageArgs()
     {
         return new Object[]{ getActionName(), getFlowControllerURI() };
@@ -39,8 +39,13 @@
         return new String[]{ "A double-post occurred for action ", " in page 
flow ", "." };
     }
     
-    public int getResponseErrorCode()
+    public void sendResponseErrorCode( HttpServletResponse response ) throws 
IOException
+    {
+        response.sendError( HttpServletResponse.SC_BAD_REQUEST, 
getLocalizedMessage() );
+    }
+    
+    public boolean causeMayBeSessionExpiration()
     {
-        return HttpServletResponse.SC_BAD_REQUEST;
+        return true;
     }
 }

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/EmptyNestingStackException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/EmptyNestingStackException.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/EmptyNestingStackException.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/EmptyNestingStackException.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/EmptyNestingStackException.java
        (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/EmptyNestingStackException.java
        Mon Dec  6 16:11:44 2004
@@ -41,4 +41,9 @@
     {
         return new String[]{ "Empty nesting stack for returned action ", " 
from Page Flow ", "." };
     }
+
+    public boolean causeMayBeSessionExpiration()
+    {
+        return true;
+    }
 }

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/FlowController.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/FlowController.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/FlowController.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/FlowController.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/FlowController.java
    (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/FlowController.java
    Mon Dec  6 16:11:44 2004
@@ -23,9 +23,8 @@
 import org.apache.beehive.netui.util.FileUtils;
 import org.apache.beehive.netui.pageflow.internal.InternalUtils;
 import org.apache.beehive.netui.pageflow.internal.InternalExpressionUtils;
-import org.apache.beehive.netui.pageflow.internal.RequestValues;
-import org.apache.beehive.netui.pageflow.internal.DeferredPageFlowException;
-import org.apache.beehive.netui.pageflow.annotations.Jpf;import 
org.apache.beehive.netui.pageflow.handler.LoginHandler;
+import org.apache.beehive.netui.pageflow.annotations.Jpf;
+import org.apache.beehive.netui.pageflow.handler.LoginHandler;
 import org.apache.beehive.netui.pageflow.handler.ExceptionsHandler;
 import org.apache.beehive.netui.util.cache.ClassLevelCache;
 import org.apache.beehive.netui.util.logging.Logger;
@@ -43,6 +42,7 @@
 
 import javax.security.auth.login.LoginException;
 import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
 import javax.servlet.jsp.el.ELException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -227,18 +227,16 @@
      * 
      * @param ex the Exception to handle.
      * @param mapping the Struts action mapping for current Struts action 
being processed.
-     * @param actionName the name of the Struts action being processed.
      * @param form the form-bean (if any) associated with the Struts action 
being processed.  May be null.
      * @param request the current HttpServletRequest.
      * @param response the current HttpServletResponse.
      * @return a Struts ActionForward object that specifies the URI that 
should be displayed.
-     * @throws Exception if another Exception is thrown during handling of 
<code>ex</code>.
+     * @throws ServletException if another Exception is thrown during handling 
of <code>ex</code>.
      */ 
     protected synchronized ActionForward handleException( Throwable ex, 
ActionMapping mapping,
-                                                          String actionName, 
ActionForm form,
-                                                          HttpServletRequest 
request,
+                                                          ActionForm form, 
HttpServletRequest request,
                                                           HttpServletResponse 
response )
-        throws Exception
+        throws IOException, ServletException
     {
         PerRequestState prevState = setPerRequestState( new PerRequestState( 
request, response, mapping ) );
         
@@ -249,7 +247,7 @@
             // First, put the exception into the request (or other applicable 
context).
             Throwable unwrapped = eh.unwrapException( ex );
             eh.exposeException( unwrapped, mapping, request, response, 
getServletContext() );
-            return eh.handleException( unwrapped, mapping, actionName, form, 
this, request, response, getServletContext() );
+            return eh.handleException( unwrapped, mapping, form, this, 
request, response, getServletContext() );
         }
         finally
         {
@@ -270,7 +268,7 @@
 
     protected String getCurrentActionName()
     {
-        return PageFlowUtils.getActionName( getActionMapping() );
+        return InternalUtils.getActionName( getActionMapping() );
     }
     
     /**
@@ -335,7 +333,6 @@
         // First change the actionPath (path) so that it lines up with our 
naming convention
         // for action methods.
         //
-        String actionName = PageFlowUtils.getActionName( mapping );
         boolean gotPastBeforeAction = false;
         ServletContext servletContext = getServletContext();
         PerRequestState prevState = setPerRequestState( new PerRequestState( 
request, response, mapping ) );
@@ -388,24 +385,7 @@
                 }                
             }
             
-            //
-            // Look to see if we need are in a disambiguated action, i.e., one 
whose name is qualified
-            // by the form.  If so, we need to restore the unqualified action 
name.
-            //
-            if ( pfActionMapping != null )
-            {
-                String unqualifiedAction = 
pfActionMapping.getUnqualifiedActionName();
-                
-                if ( unqualifiedAction != null )
-                {
-                    actionName = unqualifiedAction;
-                    
-                    if ( _log.isDebugEnabled() )
-                    {
-                        _log.debug( "Using path /" + unqualifiedAction + " 
instead of " + pfActionMapping.getPath() );
-                    }
-                }
-            }
+            String actionName = InternalUtils.getActionName( mapping );
             
             //
             // Check whether isLoginRequired=true for this action.
@@ -416,22 +396,7 @@
                  && loginHandler.getUserPrincipal( request ) == null )
             {
                 NotLoggedInException ex = createNotLoggedInException( 
actionName, request );
-                ex.setFlowController( this );
-                return handleException( ex, mapping, actionName, form, 
request, response );
-            }
-            
-            //
-            //
-            // ...but if there was a role-checking failure in 
PageFlowRequestProcessor.processRoles(),
-            // throw an exception here.  Doing it this way allows the user to 
handle the exception
-            // through declarative exception-handling.
-            //
-            DeferredPageFlowException deferredException = 
RequestValues.getDeferredException( request, true );
-            
-            if ( deferredException != null )
-            {
-                deferredException.setFlowController( this );
-                return handleException( deferredException, mapping, 
actionName, form, request, response );
+                return handleException( ex, mapping, form, request, response );
             }
             
             //
@@ -458,7 +423,7 @@
             // should not be handled by handleException() -- it's probably a 
framework problem and
             // should bubble out to the container.
             //
-            return handleException( e, mapping, actionName, form, request, 
response );
+            return handleException( e, mapping, form, request, response );
         }
         finally
         {
@@ -477,7 +442,7 @@
                     }
                     catch ( Throwable th )
                     {
-                        overrideReturn = handleException( th, mapping, 
actionName, form, request, response );
+                        overrideReturn = handleException( th, mapping, form, 
request, response );
                     }
                 }            
                 
@@ -510,21 +475,16 @@
                                          servletContext, this );
     }
     
-    static NotLoggedInException createNotLoggedInException( String actionName, 
HttpServletRequest request )
+    NotLoggedInException createNotLoggedInException( String actionName, 
HttpServletRequest request )
     {
-        String requestedSessionID = request.getRequestedSessionId();
-
-        if ( requestedSessionID != null )
+        if ( InternalUtils.sessionExpired( request ) )
         {
-            HttpSession session = request.getSession( false );
-            
-            if ( session == null || ! requestedSessionID.equals( 
session.getId() ) )
-            {
-                return new LoginExpiredException( actionName );
-            }
+            return new LoginExpiredException( actionName, this );
+        }
+        else
+        {
+            return new NotLoggedInException( actionName, this );
         }
-        
-        return new NotLoggedInException( actionName );
     }
     
     public synchronized void create( HttpServletRequest request, 
HttpServletResponse response, ServletContext servletContext )
@@ -544,7 +504,7 @@
                 try
                 {
                     _log.info( "Handling exception in onCreate(), page flow " 
+ this, th );
-                    ActionForward fwd = handleException( th, null, 
"[onCreate]", null, request, response );
+                    ActionForward fwd = handleException( th, null, null, 
request, response );
                     if ( fwd == null ) fwd = NULL_ACTION_FORWARD;
                     request.setAttribute( ONCREATE_EXCEPTION_FORWARD, fwd );
                 }
@@ -761,7 +721,9 @@
             _log.warn( msg.toString() );
         }
 
-        throw new NoMatchingActionMethodException( actionName, inputForm, this 
);
+        PageFlowException ex = new NoMatchingActionMethodException( 
actionName, inputForm, this );
+        InternalUtils.throwPageFlowException( ex, request );
+        return null;
     }
 
     private static String getFormQualifiedActionPath( Class formClass, String 
actionPath )
@@ -1066,7 +1028,7 @@
         
         if ( mapping == null )
         {
-            throw new ActionNotFoundException( actionName, this, form );
+            InternalUtils.throwPageFlowException( new ActionNotFoundException( 
actionName, this, form ), request );
         }
         
         ActionForward fwd = getActionMethodForward( actionName, form, request, 
response, mapping );
@@ -1351,7 +1313,6 @@
      * 
      * @param method the action handler method to invoke.
      * @param ex the Throwable that is to be handled.
-     * @param actionName the name of the Struts action being processed.
      * @param message the String message that is to be passed to the handler 
method.
      * @param formBean the form bean that is associated with the action being 
processed; may be
      *            <code>null</code>.
@@ -1359,12 +1320,10 @@
      * @param response the current HttpServletResponse.
      * @param readonly if <code>true</code>, session failover will not be 
triggered after invoking the method.
      * @return the ActionForward returned by the exception handler method.
-     * @throws Exception if an Exception was raised in user code.
      */
     public synchronized ActionForward invokeExceptionHandler(
-            Method method, Throwable ex, String actionName, String message, 
Object formBean, ActionForm wrappedFormBean,
+            Method method, Throwable ex, String message, Object formBean, 
ActionForm wrappedFormBean,
             ActionMapping actionMapping, HttpServletRequest request, 
HttpServletResponse response, boolean readonly )
-        throws Exception
     {
         ActionForward result = null;
         PerRequestState prevState = setPerRequestState( new PerRequestState( 
request, response, actionMapping ) );
@@ -1380,6 +1339,12 @@
             try
             {
                 ActionForward retVal = null;
+                String actionName = InternalUtils.getActionName( actionMapping 
);
+                
+                if ( actionName == null && ex instanceof PageFlowException )
+                {
+                    actionName = ( ( PageFlowException ) ex ).getActionName();
+                }
             
                 try
                 {

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/Forward.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/Forward.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/Forward.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/Forward.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/Forward.java
   (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/Forward.java
   Mon Dec  6 16:11:44 2004
@@ -292,10 +292,11 @@
         
         if ( _init && getRedirect() )
         {
-            String actionPath = ( _mappingPath != null ? _mappingPath : "" );
-            String descrip = ( getName() != null ? getName() : getPath() );
-            throw new IllegalRedirectOutputFormException( descrip, actionPath, 
_flowController,
-                                                          
formBean.getClass().getName() );
+            String actionPath = _mappingPath != null ? _mappingPath : "";
+            String descrip = getName() != null ? getName() : getPath();
+            PageFlowException ex =  new IllegalRedirectOutputFormException( 
descrip, actionPath, _flowController,
+                                                                            
formBean.getClass().getName() );
+            InternalUtils.throwPageFlowException( ex );
         }
 
         _outputForms.add( InternalUtils.wrapFormBean( formBean ) );
@@ -415,7 +416,8 @@
 
             if ( fwd == null )
             {
-                throw new UnresolvableForwardException( getName(), 
_mappingPath, _flowController );
+                PageFlowException ex = new UnresolvableForwardException( 
getName(), _mappingPath, _flowController );
+                InternalUtils.throwPageFlowException( ex );
             }
 
             initFrom( fwd );
@@ -424,14 +426,18 @@
             {
                 if ( _actionOutputs != null && ! _actionOutputs.isEmpty() )
                 {
-                    throw new IllegalActionOutputException( getName(), 
_mappingPath, _flowController,
-                                                           ( String ) 
_actionOutputs.keySet().iterator().next() );
+                    PageFlowException ex =
+                            new IllegalActionOutputException( getName(), 
_mappingPath, _flowController,
+                                                             ( String ) 
_actionOutputs.keySet().iterator().next() );
+                    InternalUtils.throwPageFlowException( ex );
                 }
                 
                 if ( _outputForms != null && ! _outputForms.isEmpty() )
                 {
-                    throw new IllegalRedirectOutputFormException( getName(), 
_mappingPath, _flowController,
-                                                                  
_outputForms.get( 0 ).getClass().getName() );
+                    PageFlowException ex =
+                            new IllegalRedirectOutputFormException( getName(), 
_mappingPath, _flowController,
+                                                                    
_outputForms.get( 0 ).getClass().getName() );
+                    InternalUtils.throwPageFlowException( ex );
                 }
             }
         }
@@ -558,9 +564,11 @@
                 
                 if ( ! returnFormClass.isInstance( outputForm ) )
                 {
-                    throw new IllegalOutputFormTypeException( getName(), 
_mappingPath, _flowController,
-                                                              
outputForm.getClass().getName(),
-                                                              
returnFormClass.getName() );
+                    PageFlowException ex = 
+                            new IllegalOutputFormTypeException( getName(), 
_mappingPath, _flowController,
+                                                                
outputForm.getClass().getName(),
+                                                                
returnFormClass.getName() );
+                    InternalUtils.throwPageFlowException( ex );
                 }
             }
             
@@ -587,8 +595,9 @@
             if ( ! actionOutput.getNullable()
                  && ( _actionOutputs == null || _actionOutputs.get( 
actionOutput.getName() ) == null ) )
             {
-                throw new MissingActionOutputException( _mappingPath, 
_flowController, actionOutput.getName(),
-                                                        getName() );
+                PageFlowException ex =
+                    new MissingActionOutputException( _mappingPath, 
_flowController, actionOutput.getName(), getName() );
+                InternalUtils.throwPageFlowException( ex );
             }
                 
             //
@@ -640,10 +649,12 @@
                         
                     if ( actualArrayDims != expectedArrayDims || ! 
expectedType.isAssignableFrom( actualType ) )
                     {
-                        throw new MismatchedActionOutputException( 
_mappingPath, _flowController,
-                                                                   
actionOutput.getName(), getName(),
-                                                                   
expectedTypeName,
-                                                                   
actualType.getName() + arraySuffix );
+                        PageFlowException ex =
+                                new MismatchedActionOutputException( 
_mappingPath, _flowController,
+                                                                     
actionOutput.getName(), getName(),
+                                                                     
expectedTypeName,
+                                                                     
actualType.getName() + arraySuffix );
+                        InternalUtils.throwPageFlowException( ex );
                     }
                 }
             }
@@ -896,7 +907,8 @@
         {
             String actionPath = ( _mappingPath != null ? _mappingPath : "" );
             String descrip = ( getName() != null ? getName() : getPath() );
-            throw new IllegalActionOutputException( descrip, actionPath, 
_flowController, name );
+            PageFlowException ex = new IllegalActionOutputException( descrip, 
actionPath, _flowController, name );
+            InternalUtils.throwPageFlowException( ex );
         }
         
         _actionOutputs.put( name, value );

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/ForwardHandler.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/ForwardHandler.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/ForwardHandler.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/ForwardHandler.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/ForwardHandler.java
    (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/ForwardHandler.java
    Mon Dec  6 16:11:44 2004
@@ -69,7 +69,9 @@
 
             if ( ! pageFlowFwd.doesResolve() )
             {
-                throw new UnresolvableForwardException( pageFlowFwd.getName(), 
actionName, flowController );
+                PageFlowException ex =
+                        new UnresolvableForwardException( 
pageFlowFwd.getName(), actionName, flowController );
+                InternalUtils.throwPageFlowException( ex, request );
             }
 
             //
@@ -89,7 +91,8 @@
                 
                 if ( curJpf == null )
                 {
-                    throw new NoCurrentPageFlowException( actionName, 
pageFlowFwd );
+                    PageFlowException ex = new NoCurrentPageFlowException( 
actionName, pageFlowFwd );
+                    InternalUtils.throwPageFlowException( ex, request );
                 }
                 
                 PreviousPageInfo prevPageInfo;
@@ -196,7 +199,8 @@
                 _log.info( "Attempted return-to-page, but previous page info 
was missing." );
             }
         
-            throw new NoPreviousPageException( actionName, pageFlowFwd, 
currentPageFlow );
+            PageFlowException ex = new NoPreviousPageException( actionName, 
pageFlowFwd, currentPageFlow );
+            InternalUtils.throwPageFlowException( ex, request );
         }
         
         //
@@ -298,7 +302,8 @@
         
         if ( curJpf == null )
         {
-            throw new NoCurrentPageFlowException( actionName, pageFlowFwd );
+            PageFlowException ex = new NoCurrentPageFlowException( actionName, 
pageFlowFwd );
+            InternalUtils.throwPageFlowException( ex, request );
         }
                         
         PreviousActionInfo prevActionInfo = curJpf.getPreviousActionInfo();
@@ -353,7 +358,10 @@
                 _log.info( "Attempted return-to-action, but previous action 
info was missing." );
             }
             
-            throw new NoPreviousActionException( actionName, pageFlowFwd, 
curJpf );
+            PageFlowException ex = new NoPreviousActionException( actionName, 
pageFlowFwd, curJpf );
+            InternalUtils.throwPageFlowException( ex, request );
+            assert false;   // previous method always throws
+            return null;
         }
     }
     
@@ -361,7 +369,7 @@
                                   HttpServletResponse response, ActionForm 
form, ServletContext servletContext,
                                   FlowController flowController )
     {
-        return forwardTo( fwd, mapping, request, response, 
PageFlowUtils.getActionName( mapping ), null, form,
+        return forwardTo( fwd, mapping, request, response, 
InternalUtils.getActionName( mapping ), null, form,
                           servletContext, flowController );
     }
     
@@ -389,7 +397,8 @@
                 _log.warn( msg.append( '.' ).toString() );
             }
                     
-            throw new EmptyNestingStackException( exitAction, curJpf );
+            PageFlowException ex = new EmptyNestingStackException( exitAction, 
curJpf );
+            InternalUtils.throwPageFlowException( ex, request );
         }
                 
         PageFlowStack.PushedPageFlow pushedPageFlowWrapper = pfStack.pop( 
request );

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/IllegalActionOutputException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/IllegalActionOutputException.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/IllegalActionOutputException.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/IllegalActionOutputException.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/IllegalActionOutputException.java
      (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/IllegalActionOutputException.java
      Mon Dec  6 16:11:44 2004
@@ -98,4 +98,9 @@
             "\"), but is set to redirect=\"true\".  Action outputs may not be 
used on redirect forwards."
         };
     }
+
+    public boolean causeMayBeSessionExpiration()
+    {
+        return false;
+    }
 }

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/IllegalOutputFormException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/IllegalOutputFormException.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/IllegalOutputFormException.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/IllegalOutputFormException.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/IllegalOutputFormException.java
        (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/IllegalOutputFormException.java
        Mon Dec  6 16:11:44 2004
@@ -82,4 +82,9 @@
     {
         _outputFormType = outputFormType;
     }
+
+    public boolean causeMayBeSessionExpiration()
+    {
+        return false;
+    }
 }

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/InfiniteReturnToActionException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/InfiniteReturnToActionException.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/InfiniteReturnToActionException.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/InfiniteReturnToActionException.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/InfiniteReturnToActionException.java
   (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/InfiniteReturnToActionException.java
   Mon Dec  6 16:11:44 2004
@@ -44,4 +44,9 @@
             "."
         };
     }
+
+    public boolean causeMayBeSessionExpiration()
+    {
+        return false;
+    }
 }

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/LoginExpiredException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/LoginExpiredException.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/LoginExpiredException.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/LoginExpiredException.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/LoginExpiredException.java
     (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/LoginExpiredException.java
     Mon Dec  6 16:11:44 2004
@@ -25,11 +25,6 @@
 public class LoginExpiredException
         extends NotLoggedInException
 {    
-    public LoginExpiredException( String actionName )
-    {
-        super( actionName );
-    }
-    
     public LoginExpiredException( String actionName, FlowController fc )
     {
         super( actionName, fc );

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/MismatchedActionOutputException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/MismatchedActionOutputException.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/MismatchedActionOutputException.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/MismatchedActionOutputException.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/MismatchedActionOutputException.java
   (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/MismatchedActionOutputException.java
   Mon Dec  6 16:11:44 2004
@@ -69,4 +69,9 @@
     {
         return _actualType;
     }
+
+    public boolean causeMayBeSessionExpiration()
+    {
+        return false;
+    }
 }

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/MissingActionOutputException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/MissingActionOutputException.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/MissingActionOutputException.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/MissingActionOutputException.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/MissingActionOutputException.java
      (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/MissingActionOutputException.java
      Mon Dec  6 16:11:44 2004
@@ -55,4 +55,9 @@
     {
         return _forwardName;
     }
+
+    public boolean causeMayBeSessionExpiration()
+    {
+        return false;
+    }
 }

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NoCurrentPageFlowException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NoCurrentPageFlowException.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NoCurrentPageFlowException.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NoCurrentPageFlowException.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NoCurrentPageFlowException.java
        (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NoCurrentPageFlowException.java
        Mon Dec  6 16:11:44 2004
@@ -37,4 +37,9 @@
     {
         return new String[]{ "No current page flow for return-to=\"", "\" on 
action ", "." };
     }
+
+    public boolean causeMayBeSessionExpiration()
+    {
+        return true;
+    }
 }

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NoMatchingActionMethodException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NoMatchingActionMethodException.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NoMatchingActionMethodException.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NoMatchingActionMethodException.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NoMatchingActionMethodException.java
   (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NoMatchingActionMethodException.java
   Mon Dec  6 16:11:44 2004
@@ -56,4 +56,9 @@
             "Could not find matching action method for action=", ", form=", " 
on Page Flow ", "."
         };
     }
+
+    public boolean causeMayBeSessionExpiration()
+    {
+        return false;
+    }
 }

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NotLoggedInException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NotLoggedInException.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NotLoggedInException.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NotLoggedInException.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NotLoggedInException.java
      (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/NotLoggedInException.java
      Mon Dec  6 16:11:44 2004
@@ -17,9 +17,8 @@
  */
 package org.apache.beehive.netui.pageflow;
 
-import org.apache.beehive.netui.pageflow.internal.DeferredPageFlowException;
-
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 
 
 /**
@@ -34,13 +33,9 @@
  * will be thrown instead of the <code>NotLoggedInException</code>.
  */ 
 public class NotLoggedInException
-        extends DeferredPageFlowException
+        extends PageFlowException
+        implements ResponseErrorCodeSender
 {
-    public NotLoggedInException( String actionName )
-    {
-        super( actionName );
-    }
-    
     public NotLoggedInException( String actionName, FlowController fc )
     {
         super( actionName, fc );
@@ -55,12 +50,17 @@
     {
         return new String[]
         {
-            "Action ", " on Page Flow ", " requires a current user, but there 
is no logged-in user."
+            "Action ", " on page flow ", " requires a current user, but there 
is no logged-in user."
         };
     }
 
-    public int getResponseErrorCode()
+    public void sendResponseErrorCode( HttpServletResponse response ) throws 
IOException
+    {
+        response.sendError( HttpServletResponse.SC_BAD_REQUEST, 
getLocalizedMessage() );
+    }
+
+    public boolean causeMayBeSessionExpiration()
     {
-        return HttpServletResponse.SC_BAD_REQUEST;
+        return true;
     }
 }

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowException.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowException.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowException.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowException.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowException.java
 Mon Dec  6 16:11:44 2004
@@ -19,6 +19,7 @@
 
 import org.apache.beehive.netui.util.Bundle;
 import org.apache.beehive.netui.pageflow.internal.InternalUtils;
+import org.apache.struts.action.ActionMapping;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -82,4 +83,6 @@
     {
         return _actionName;
     }
+    
+    public abstract boolean causeMayBeSessionExpiration();
 }

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java
  (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowRequestProcessor.java
  Mon Dec  6 16:11:44 2004
@@ -43,7 +43,6 @@
 import javax.servlet.FilterChain;
 import javax.servlet.Servlet;
 import javax.servlet.ServletConfig;
-import javax.servlet.Filter;
 import javax.servlet.ServletRequest;
 import javax.servlet.ServletResponse;
 import java.io.IOException;
@@ -79,7 +78,6 @@
 import org.apache.beehive.netui.pageflow.internal.InternalUtils;
 import org.apache.beehive.netui.pageflow.internal.JavaControlUtils;
 import org.apache.beehive.netui.pageflow.internal.FlowControllerAction;
-import org.apache.beehive.netui.pageflow.internal.DeferredPageFlowException;
 import org.apache.beehive.netui.pageflow.internal.ServerAdapterManager;
 import org.apache.beehive.netui.pageflow.scoping.ScopedServletUtils;
 import org.apache.beehive.netui.pageflow.scoping.ScopedRequest;
@@ -141,21 +139,6 @@
             action.setServlet( servlet );
             return action;
         }
-        else
-        {
-            //
-            // It's a non-FlowController action.  Now act on any deferred 
failure from
-            // processRoles() in the same way that Struts would have acted, 
namely, by
-            // sending an HTTP error.
-            //
-            DeferredPageFlowException deferredEx = 
RequestValues.getDeferredException( request, true );
-            
-            if ( deferredEx != null )
-            {
-                response.sendError( deferredEx.getResponseErrorCode(), 
deferredEx.getResponseErrorMessage() );
-                return null;
-            }
-        }
 
         return super.processActionCreate( request, response, actionMapping );
     }
@@ -249,12 +232,6 @@
                                             ActionMapping mapping )
     {
         //
-        // We're deferring some failures until the action phase.  But if there 
was a failure, we need to avoid
-        // doing anything here.
-        //
-        if ( RequestValues.getDeferredException( request, false ) != null ) 
return null;
-        
-        //
         // See if we're using a pageflow-scoped form (a member variable in the 
current pageflow).
         //
         Field formMemberField = getPageFlowScopedFormMember( mapping, request 
);
@@ -355,12 +332,6 @@
         throws ServletException
     {
         //
-        // We're deferring some failures until the action phase.  But if there 
was a failure, we need to avoid
-        // doing anything here.
-        //
-        if ( RequestValues.getDeferredException( request, false ) != null ) 
return;
-        
-        //
         // If a previous action forwarded us a form, use that -- don't 
populate it from request parameters.
         //
         ActionForm previousForm = RequestValues.getForwardedForm( request, 
true );
@@ -405,56 +376,6 @@
         }
     }
 
-    protected boolean processValidate( HttpServletRequest request, 
HttpServletResponse response, ActionForm form, ActionMapping mapping )
-            throws IOException, ServletException
-    {
-        //
-        // We're deferring some failures until the action phase.  But if there 
was a failure, we need to avoid
-        // doing anything here.
-        //
-        if ( RequestValues.getDeferredException( request, false ) == null )
-        {
-            return super.processValidate( request, response, form, mapping );
-        }
-        else
-        {
-            return true;
-        }
-    }
-
-    protected boolean processForward( HttpServletRequest request, 
HttpServletResponse response, ActionMapping mapping )
-            throws IOException, ServletException
-    {
-        //
-        // We're deferring some failures until the action phase.  But if there 
was a failure, we need to avoid
-        // doing anything here.
-        //
-        if ( RequestValues.getDeferredException( request, false ) == null )
-        {
-            return super.processForward( request, response, mapping );
-        }
-        else
-        {
-            return true;
-        }
-    }
-
-    protected boolean processInclude( HttpServletRequest request, 
HttpServletResponse response, ActionMapping mapping ) throws IOException, 
ServletException
-    {
-        //
-        // We're deferring some failures until the action phase.  But if there 
was a failure, we need to avoid
-        // doing anything here.
-        //
-        if ( RequestValues.getDeferredException( request, false ) == null )
-        {
-            return super.processInclude( request, response, mapping );
-        }
-        else
-        {
-            return true;
-        }
-    }
-
     /**
      * The requested action can be overridden by a request parameter.  In this 
case, we parse the action from
      * the request parameter and forward to a URI constructed from it.
@@ -607,13 +528,15 @@
                         + " for \"controllerClass\".  Page Flow actions in 
this module may not be handled correctly." );
         }
         
+        FlowController currentFlowController = null;
+        
         if ( flowControllerClassName != null )
         {
             try
             {
-                FlowController fc =
+                currentFlowController = 
                         InternalUtils.getFlowController( 
flowControllerClassName, request,  response, servletContext );
-                RequestValues.setCurrentFlowController( request, fc );
+                RequestValues.setCurrentFlowController( request, 
currentFlowController );
             }
             catch ( ClassNotFoundException e )
             {
@@ -635,9 +558,43 @@
         //
         ImplicitObjectUtil.loadImplicitObjects( request, response, 
servletContext, jpf );
         
-        super.process( request, response );
+        try
+        {
+            super.process( request, response );
+        }
+        catch ( ServletException servletEx )
+        {
+            // If a ServletException escapes out of any of the processing 
methods, let the current FlowController handle it.
+            if ( ! handleException( servletEx, currentFlowController, request, 
response ) ) throw servletEx;
+        }
+        catch ( IOException ioe )
+        {
+            // If an IOException escapes out of any of the processing methods, 
let the current FlowController handle it.
+            if ( ! handleException( ioe, currentFlowController, request, 
response ) ) throw ioe;
+        }
+        catch ( Throwable th )
+        {
+            // If a Throwable escapes out of any of the processing methods, 
let the current FlowController handle it.
+            if ( ! handleException( th, currentFlowController, request, 
response ) ) throw new ServletException( th );
+        }
     }
-
+    
+    private boolean handleException( Throwable th, FlowController fc, 
HttpServletRequest request,
+                                     HttpServletResponse response )
+            throws ServletException, IOException
+    {
+        if ( fc != null )
+        {
+            ActionMapping mapping = InternalUtils.getCurrentActionMapping( 
request );
+            ActionForm form = InternalUtils.getCurrentActionForm( request );
+            ActionForward fwd = fc.handleException( th, mapping, form, 
request, response );
+            processForwardConfig( request, response, fwd );
+            return true;
+        }
+        
+        return false;
+    }
+    
     /**
      * Process any direct request for a page flow by forwarding to its "begin" 
action.
      * 
@@ -961,7 +918,9 @@
         return false;
     }
     
-    private static void checkTransaction( HttpServletRequest request, 
ActionMapping mapping )
+    private ActionMapping checkTransaction( HttpServletRequest request, 
HttpServletResponse response,
+                                            ActionMapping mapping, String 
actionPath )
+        throws IOException
     {
         //
         // TODO: We haven't yet hooked up the support for marking an action as 
preventDoublePost=true.
@@ -970,10 +929,29 @@
         {
             if ( ! TokenProcessor.getInstance().isTokenValid( request, true ) )
             {
-                DoubleFormPostException ex = new DoubleFormPostException( 
PageFlowUtils.getActionName( mapping ) );
-                RequestValues.setDeferredException( request, ex );
+                FlowController currentFC = 
RequestValues.getCurrentFlowController( request );
+                String actionName = InternalUtils.getActionName( mapping );
+                DoubleFormPostException ex = new DoubleFormPostException( 
actionName, currentFC );
+                
+                if ( currentFC != null )
+                {
+                    try
+                    {
+                        ActionForward fwd = currentFC.handleException( ex, 
mapping, null, request, response );
+                        return new ExceptionHandledActionMapping( actionPath, 
fwd );
+                    }
+                    catch ( ServletException servletException)
+                    {
+                        _log.error( "Exception occurred while handling " + 
ex.getClass().getName(), servletException );
+                    }
+                }
+                
+                ex.sendResponseErrorCode( response );
+                return null;
             }
         }
+        
+        return mapping;
     }
    
     public void init( ActionServlet actionServlet, ModuleConfig mc )
@@ -1120,8 +1098,7 @@
                                 + ", form " + forwardedFormClass.getName() );
                 }
                 
-                checkTransaction( request, bestMatch );
-                return bestMatch;
+                return checkTransaction( request, response, bestMatch, path );
             }
         }
         
@@ -1146,8 +1123,7 @@
             if ( ! wrongForm )
             {
                 request.setAttribute( Globals.MAPPING_KEY, mapping );
-                checkTransaction( request, mapping );
-                return mapping;
+                return checkTransaction( request, response, mapping, path );
             }
         }
 
@@ -1161,8 +1137,7 @@
             {
                 mapping = ( ActionMapping ) configs[i];
                 request.setAttribute( Globals.MAPPING_KEY, mapping );
-                checkTransaction( request, mapping );
-                return mapping;
+                return checkTransaction( request, response, mapping, path );
             }
         }
 
@@ -1261,11 +1236,11 @@
             {
                 Exception ex = new ActionNotFoundException( actionPath, fc, 
returningForm );
                 InternalUtils.setCurrentModule( fc.getModuleConfig(), request 
);
-                ActionForward result = fc.handleException( ex, null, 
actionPath, null, request, response );
+                ActionForward result = fc.handleException( ex, null, null, 
request, response );
                 return new ExceptionHandledActionMapping( actionPath, result );
             }
         }
-        catch ( Exception e )
+        catch ( ServletException e )
         {
             // ignore this -- just let Struts do its thing.
             
@@ -1316,24 +1291,34 @@
         }
                 
         //
-        // Here, Struts sends an HTTP error.  We just store the result in the 
request, so
-        // logic in FlowController can generate an exception at the right time.
+        // Here, Struts sends an HTTP error.  We try to let the current page 
flow handle a relevant exception.
         //
         LoginHandler loginHandler = ContextCache.get( getServletContext() 
).getLoginHandler();
-        String actionName = PageFlowUtils.getActionName( mapping );
-        DeferredPageFlowException ex;
+        String actionName = InternalUtils.getActionName( mapping );
+        FlowController currentFC = RequestValues.getCurrentFlowController( 
request );
+        PageFlowException ex;
         
         if ( loginHandler.getUserPrincipal( request ) == null )
         {
-            ex = FlowController.createNotLoggedInException( actionName, 
request );
+            ex = currentFC.createNotLoggedInException( actionName, request );
         }
         else
         {
-            ex = new UnfulfilledRolesException( mapping.getRoleNames(), 
mapping.getRoles(), actionName );
+            ex = new UnfulfilledRolesException( mapping.getRoleNames(), 
mapping.getRoles(), actionName, currentFC );
         }
-                        
-        RequestValues.setDeferredException( request, ex );
-        return true;    // We'll fail later, in processActionCreate.
+        
+        if ( currentFC != null )
+        {
+            ActionForward fwd = currentFC.handleException( ex, mapping, null, 
request, response );
+            processForwardConfig( request, response, fwd );
+        }
+        else
+        {
+            assert ex instanceof ResponseErrorCodeSender : 
ex.getClass().getName();
+            ( ( ResponseErrorCodeSender ) ex ).sendResponseErrorCode( response 
);
+        }
+        
+        return false;
     }
     
     private static String addScopeParams( String url, HttpServletRequest 
request )
@@ -1742,7 +1727,7 @@
         //
         if ( ! ActionInterceptorChain.isReturningFromIntercept( request ) && 
pfc != null )
         {
-            String actionName = PageFlowUtils.getActionName( mapping );
+            String actionName = InternalUtils.getActionName( mapping );
             ActionInterceptorChain interceptorChain =
                     ActionInterceptorChain.getBeforeActionChain( actionName, 
request, servletContext );
             if ( interceptorChain != null )

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowUtils.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowUtils.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowUtils.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowUtils.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowUtils.java
     (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/PageFlowUtils.java
     Mon Dec  6 16:11:44 2004
@@ -18,6 +18,7 @@
 package org.apache.beehive.netui.pageflow;
 
 import org.apache.beehive.netui.pageflow.config.PageFlowActionFormBean;
+import org.apache.beehive.netui.pageflow.config.PageFlowActionMapping;
 import org.apache.beehive.netui.pageflow.internal.ActionResultImpl;
 import org.apache.beehive.netui.pageflow.internal.InternalUtils;
 import org.apache.beehive.netui.pageflow.internal.RequestValues;
@@ -914,12 +915,6 @@
         }
         
         return request;
-    }
-    
-    static String getActionName( ActionMapping mapping )
-    {
-        String actionName = mapping.getPath();
-        return ( actionName.charAt( 0 ) == '/' ? actionName.substring( 1 ) : 
actionName );
     }
     
     /**

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/UnfulfilledRolesException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/UnfulfilledRolesException.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/UnfulfilledRolesException.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/UnfulfilledRolesException.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/UnfulfilledRolesException.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/UnfulfilledRolesException.java
 Mon Dec  6 16:11:44 2004
@@ -17,10 +17,10 @@
  */
 package org.apache.beehive.netui.pageflow;
 
-import org.apache.beehive.netui.pageflow.internal.DeferredPageFlowException;
 import org.apache.beehive.netui.util.Bundle;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
 
 
 /**
@@ -29,7 +29,8 @@
  * who does not fulfil any of the given roles.
  */ 
 public class UnfulfilledRolesException
-        extends DeferredPageFlowException
+        extends PageFlowException
+        implements ResponseErrorCodeSender
 {
     private String[] _roleNames;
     private String _rolesList;
@@ -40,9 +41,9 @@
      * 
      * @param roleNames an array of String role names.
      */ 
-    public UnfulfilledRolesException( String[] roleNames, String rolesList, 
String actionName)
+    public UnfulfilledRolesException( String[] roleNames, String rolesList, 
String actionName, FlowController fc )
      {
-        super( actionName );
+        super( actionName, fc );
         _roleNames = roleNames;
         _rolesList = rolesList;
     }
@@ -71,13 +72,14 @@
         };
     }
 
-    public String getResponseErrorMessage()
+    public void sendResponseErrorCode( HttpServletResponse response ) throws 
IOException
     {
-        return Bundle.getString( 
"PageFlow_UnfulfilledRolesException_ResponseMessage", getActionName() );
+        String msg = Bundle.getString( 
"PageFlow_UnfulfilledRolesException_ResponseMessage", getActionName() );
+        response.sendError( HttpServletResponse.SC_BAD_REQUEST, msg );
     }
 
-    public int getResponseErrorCode()
+    public boolean causeMayBeSessionExpiration()
     {
-        return HttpServletResponse.SC_BAD_REQUEST;
+        return true;
     }
 }

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/UnresolvableForwardException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/UnresolvableForwardException.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/UnresolvableForwardException.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/UnresolvableForwardException.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/UnresolvableForwardException.java
      (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/UnresolvableForwardException.java
      Mon Dec  6 16:11:44 2004
@@ -69,4 +69,9 @@
             "Unable to find a forward named \"", "\" on action ", " in Page 
Flow ", "."
         };
     }
+
+    public boolean causeMayBeSessionExpiration()
+    {
+        return false;
+    }
 }

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/handler/ExceptionsHandler.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/handler/ExceptionsHandler.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/handler/ExceptionsHandler.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/handler/ExceptionsHandler.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/handler/ExceptionsHandler.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/handler/ExceptionsHandler.java
 Mon Dec  6 16:11:44 2004
@@ -24,9 +24,12 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
 
 import org.apache.beehive.netui.pageflow.FlowController;
 
+import java.io.IOException;
+
 
 /**
  * Handler for exception processing.
@@ -34,10 +37,10 @@
 public interface ExceptionsHandler
     extends Handler
 {
-    ActionForward handleException( Throwable ex, ActionMapping actionMapping, 
String actionName,
-                                   ActionForm form, FlowController 
flowController, HttpServletRequest request,
+    ActionForward handleException( Throwable ex, ActionMapping actionMapping, 
ActionForm form,
+                                   FlowController flowController, 
HttpServletRequest request,
                                    HttpServletResponse response, 
ServletContext servletContext )
-        throws Exception;
+        throws IOException, ServletException;
 
     Throwable unwrapException( Throwable ex );
 

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/DefaultExceptionsHandler.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/DefaultExceptionsHandler.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/DefaultExceptionsHandler.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/DefaultExceptionsHandler.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/DefaultExceptionsHandler.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/DefaultExceptionsHandler.java
 Mon Dec  6 16:11:44 2004
@@ -30,6 +30,7 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.UndeclaredThrowableException;
 import java.lang.reflect.Method;
@@ -57,10 +58,10 @@
     private static final String CACHEID_EXCEPTION_HANDLER_METHODS = 
"_netui:exceptionHandlers";
     
     
-    public ActionForward handleException( Throwable ex, ActionMapping 
actionMapping, String actionName,
-                                          ActionForm form, FlowController 
flowController , HttpServletRequest request,
-                                          HttpServletResponse response, 
ServletContext servletContext)
-        throws Exception
+    public ActionForward handleException( Throwable ex, ActionMapping 
actionMapping, ActionForm form,
+                                          FlowController flowController, 
HttpServletRequest request,
+                                          HttpServletResponse response, 
ServletContext servletContext )
+            throws IOException, ServletException
     {
         if ( _log.isInfoEnabled() )
         {
@@ -119,7 +120,7 @@
                 
                 if ( pfExceptionConfig.isHandlerMethod() )
                 {
-                    return invokeExceptionHandlerMethod( ex, 
pfExceptionConfig, form, actionName, actionMapping,
+                    return invokeExceptionHandlerMethod( ex, 
pfExceptionConfig, form, actionMapping,
                                                          flowController, 
request, response, servletContext );
                 }
             }
@@ -154,6 +155,13 @@
             return unwrapException( ( ( UndeclaredThrowableException ) ex 
).getUndeclaredThrowable() );
         }
         
+        if ( ex instanceof ServletException )
+        {
+            ServletException servletException = ( ServletException ) ex;
+            Throwable rootCause = servletException.getRootCause();
+            if ( rootCause != null ) return unwrapException( rootCause );
+        }
+        
         return ex;
     }
     
@@ -219,40 +227,58 @@
     protected ActionForward invokeExceptionHandlerClass( Throwable throwable, 
ExceptionConfig exceptionConfig,
                                                          ActionMapping 
actionMapping, ActionForm form,
                                                          HttpServletRequest 
request, HttpServletResponse response )
-        throws Exception
+        throws IOException, ServletException
     {
-        //
-        // Get the exception-handler class and delegate to it.
-        //
         String handlerClassName = exceptionConfig.getHandler();
-        ExceptionHandler handler = ( ExceptionHandler ) 
RequestUtils.applicationInstance( handlerClassName );
-        Exception ex = throwable instanceof Exception ? ( Exception ) 
throwable : new Exception( throwable );
-        ActionForward result = handler.execute( ex, exceptionConfig, 
actionMapping, form, request, response );
+        
+        try
+        {
+            //
+            // Get the exception-handler class and delegate to it.
+            //
+            ExceptionHandler handler = ( ExceptionHandler ) 
RequestUtils.applicationInstance( handlerClassName );
+            Exception ex = throwable instanceof Exception ? ( Exception ) 
throwable : new Exception( throwable );
+            ActionForward result = handler.execute( ex, exceptionConfig, 
actionMapping, form, request, response );
+                    
+            //
+            // See if the path is really relative to the webapp root, not 
relative to the module.  Struts doesn't by default
+            // support paths that are webapp-relative.
+            //
+            if ( exceptionConfig instanceof PageFlowExceptionConfig
+                    && ( ( PageFlowExceptionConfig ) exceptionConfig 
).isPathContextRelative() )
+            {
+                result.setContextRelative( true );
+            }
+                    
+            if ( _log.isDebugEnabled() )
+            {
+                _log.debug( "Exception-handler: forward to " + 
result.getPath() );
+            }
                 
-        //
-        // See if the path is really relative to the webapp root, not relative 
to the module.  Struts doesn't by default
-        // support paths that are webapp-relative.
-        //
-        if ( exceptionConfig instanceof PageFlowExceptionConfig
-                && ( ( PageFlowExceptionConfig ) exceptionConfig 
).isPathContextRelative() )
+            return result;
+        }
+        catch ( ClassNotFoundException e )
         {
-            result.setContextRelative( true );
+            _log.error( "Could not find exception-handler class " + 
handlerClassName, e );
+            throw new ServletException( e );
         }
-                
-        if ( _log.isDebugEnabled() )
+        catch ( InstantiationException e )
         {
-            _log.debug( "Exception-handler: forward to " + result.getPath() );
+            _log.error( "Could not create instance of exception-handler class 
" + handlerClassName, e );
+            throw new ServletException( e );
+        }
+        catch ( IllegalAccessException e )
+        {
+            _log.error( "Could not create instance of exception-handler class 
" + handlerClassName, e );
+            throw new ServletException( e );
         }
-                
-        return result;
     }
     
     protected ActionForward invokeExceptionHandlerMethod( Throwable ex, 
PageFlowExceptionConfig exceptionConfig,
-                                                          ActionForm form, 
String actionName,
-                                                          ActionMapping 
actionMapping, FlowController flowController,
-                                                          HttpServletRequest 
request, HttpServletResponse response,
-                                                          ServletContext 
servletContext )
-        throws Exception
+                                                          ActionForm form, 
ActionMapping actionMapping,
+                                                          FlowController 
flowController, HttpServletRequest request,
+                                                          HttpServletResponse 
response, ServletContext servletContext )
+        throws IOException, ServletException
     {
         String methodName = exceptionConfig.getHandler();
         Object unwrappedFormBean = InternalUtils.unwrapFormBean( form );
@@ -268,7 +294,7 @@
                 message = getMessage( messageKey, null, null, request, 
servletContext, flowController );
             }
                     
-            return flowController.invokeExceptionHandler( method, ex, 
actionName, message, unwrappedFormBean,
+            return flowController.invokeExceptionHandler( method, ex, message, 
unwrappedFormBean,
                                                           form, actionMapping, 
request, response,
                                                           
exceptionConfig.isReadonly() );
         }

Deleted: 
/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/DeferredPageFlowException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/DeferredPageFlowException.java?view=auto&rev=110052
==============================================================================

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/InternalUtils.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/InternalUtils.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/InternalUtils.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/InternalUtils.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/InternalUtils.java
    (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/InternalUtils.java
    Mon Dec  6 16:11:44 2004
@@ -21,6 +21,7 @@
 import org.apache.beehive.netui.pageflow.*;
 import org.apache.beehive.netui.pageflow.handler.ReloadableClassHandler;
 import org.apache.beehive.netui.pageflow.config.PageFlowControllerConfig;
+import org.apache.beehive.netui.pageflow.config.PageFlowActionMapping;
 import org.apache.beehive.netui.pageflow.scoping.ScopedServletUtils;
 import org.apache.beehive.netui.util.logging.Logger;
 import org.apache.beehive.netui.util.Bundle;
@@ -468,14 +469,6 @@
         errors.add( propertyName, error );
     }
     
-    
-    public static String getActionName( ActionMapping mapping )
-    {
-        String actionName = mapping.getPath();
-        return actionName.charAt( 0 ) == '/' ? actionName.substring( 1 ) : 
actionName;
-    }
-        
-        
     public static Object newReloadableInstance( String className, 
HttpServletRequest request, ServletContext servletContext )
         throws ClassNotFoundException, InstantiationException, 
IllegalAccessException
     {
@@ -1087,5 +1080,77 @@
     public static String addParam( String url, String paramName, String 
paramVal )
     {
         return url + ( url.indexOf( '?' ) != -1 ? '&' : '?' ) + paramName + 
'=' + paramVal;
+    }
+    
+    public static String getActionName( ActionMapping mapping )
+    {
+        if ( mapping == null ) return null;
+        
+        String actionName = mapping.getPath();
+        if ( actionName.charAt( 0 ) == '/' ) actionName = 
actionName.substring( 1 );
+        
+        //
+        // Look to see if we need are in a disambiguated action, i.e., one 
whose name is qualified
+        // by the form.  If so, we need to restore the unqualified action name.
+        //
+        if ( mapping instanceof PageFlowActionMapping )
+        {
+            String unqualifiedAction = ( ( PageFlowActionMapping ) mapping 
).getUnqualifiedActionName();
+            if ( unqualifiedAction != null ) actionName = unqualifiedAction;
+        }
+        
+        return actionName;
+    }
+    
+    public static ActionMapping getCurrentActionMapping( HttpServletRequest 
request )
+    {
+        return ( ActionMapping ) request.getAttribute( Globals.MAPPING_KEY );
+    }
+    
+    public static ActionForm getCurrentActionForm( HttpServletRequest request )
+    {
+        ActionMapping mapping = getCurrentActionMapping( request );
+        String attribute = mapping != null ? mapping.getAttribute() : null;
+        if ( attribute == null ) return null;
+        
+        if ( "request".equals( mapping.getScope() ) )
+        {
+            return ( ActionForm ) request.getAttribute( attribute );
+        }
+        else
+        {
+            HttpSession session = request.getSession( false );
+            return session != null ? ( ActionForm ) session.getAttribute( 
attribute ) : null;
+        }
+    }
+    
+    public static boolean sessionExpired( HttpServletRequest request )
+    {
+        String requestedSessionID = request.getRequestedSessionId();
+
+        if ( requestedSessionID != null )
+        {
+            HttpSession session = request.getSession( false );
+            return session == null || ! requestedSessionID.equals( 
session.getId() );
+        }
+        
+        return false;
+    }
+    
+    public static void throwPageFlowException( PageFlowException ex )
+    {
+        throwPageFlowException( ex, null );
+    }
+    
+    public static void throwPageFlowException( PageFlowException effect, 
HttpServletRequest request )
+            throws PageFlowException
+    {
+        if ( request != null && effect.causeMayBeSessionExpiration() && 
sessionExpired( request ) )
+        {
+            PageflowConfig pfc = ConfigUtil.getConfig().getPageflowConfig();
+            if ( pfc != null && pfc.getThrowSessionExpiredException() ) throw 
new SessionExpiredException( effect );
+        }
+        
+        throw effect;
     }
 }

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/RequestValues.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/RequestValues.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/RequestValues.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/RequestValues.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/RequestValues.java
    (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/RequestValues.java
    Mon Dec  6 16:11:44 2004
@@ -34,7 +34,6 @@
     private static final String AVOID_DIRECT_RESPONSE_OUTPUT_ATTR = 
ATTR_PREFIX + "_avoidDirectResponseOutput";
     private static final String ORIGINAL_SERVLET_PATH_ATTR = ATTR_PREFIX + 
"origServletPath";
     private static final String FORWARDED_FORMBEAN_ATTR = ATTR_PREFIX + 
"forwardedForm";
-    private static final String DEFERRED_EXCEPTION_ATTR = ATTR_PREFIX + 
"deferredException";
     private static final String CURRENT_FLOWCONTROLLER_ATTR = ATTR_PREFIX + 
"flowController";
     
     
@@ -104,21 +103,6 @@
         ActionForm form = ( ActionForm ) request.getAttribute( 
FORWARDED_FORMBEAN_ATTR );
         if ( removeFromRequest ) request.removeAttribute( 
FORWARDED_FORMBEAN_ATTR );
         return form;
-    }
-    
-    /**
-     * This is an error deferred until FlowController.execute().
-     */ 
-    public static void setDeferredException( ServletRequest request, 
DeferredPageFlowException e )
-    {
-        request.setAttribute( DEFERRED_EXCEPTION_ATTR, e );
-    }
-    
-    public static DeferredPageFlowException getDeferredException( 
ServletRequest request, boolean removeFromRequest )
-    {
-        DeferredPageFlowException e = ( DeferredPageFlowException ) 
request.getAttribute( DEFERRED_EXCEPTION_ATTR );
-        if ( removeFromRequest ) request.removeAttribute( 
DEFERRED_EXCEPTION_ATTR );
-        return e;
     }
     
     public static void setCurrentFlowController( ServletRequest request, 
FlowController fc )

Modified: 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/ReturnToException.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/ReturnToException.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/ReturnToException.java&r1=110052&p2=incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/ReturnToException.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/ReturnToException.java
        (original)
+++ 
incubator/beehive/trunk/netui/src/pageflow/org/apache/beehive/netui/pageflow/internal/ReturnToException.java
        Mon Dec  6 16:11:44 2004
@@ -43,4 +43,9 @@
     }
 
     protected abstract String[] getMessageParts();
+
+    public boolean causeMayBeSessionExpiration()
+    {
+        return true;
+    }
 }

Modified: 
incubator/beehive/trunk/netui/src/scoping/org/apache/beehive/netui/pageflow/scoping/internal/ScopedRequestImpl.java
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/scoping/org/apache/beehive/netui/pageflow/scoping/internal/ScopedRequestImpl.java?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/scoping/org/apache/beehive/netui/pageflow/scoping/internal/ScopedRequestImpl.java&r1=110052&p2=incubator/beehive/trunk/netui/src/scoping/org/apache/beehive/netui/pageflow/scoping/internal/ScopedRequestImpl.java&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/scoping/org/apache/beehive/netui/pageflow/scoping/internal/ScopedRequestImpl.java
 (original)
+++ 
incubator/beehive/trunk/netui/src/scoping/org/apache/beehive/netui/pageflow/scoping/internal/ScopedRequestImpl.java
 Mon Dec  6 16:11:44 2004
@@ -67,7 +67,6 @@
     static final String ATTR_PREFIX = "_netui:";
     private static final String OUR_SESSION_ATTR = ATTR_PREFIX + 
"scopedSession";
     private static final String STORED_ATTRS_ATTR = ATTR_PREFIX + 
"storedAttrs";
-    private static final String HIDDEN_OUTER_REQUEST_ATTRS_ATTR = ATTR_PREFIX 
+ "hiddenAttrs";
 
     private static final Logger logger = Logger.getLogger( 
ScopedRequestImpl.class );
 

Modified: 
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties&r1=110052&p2=incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties
       (original)
+++ 
incubator/beehive/trunk/netui/src/util/org/apache/beehive/netui/util/netui.properties
       Mon Dec  6 16:11:44 2004
@@ -288,6 +288,20 @@
 PageFlow_NotLoggedInException_Message= \
 Action {0} in page flow {1} requires a current user, but there is no logged-in 
user.
 
+PageFlow_SessionExpiredException_Page= \
+<html><head><title>Page Flow Error - Session Expired</title></head>\n \
+<body>\n \
+<h1>Page Flow Error - Session Expired</h1>\n \
+<table border="1" cellspacing="0">\n \
+<tr><td><b>Page Flow:</b></td><td>{1}</td></tr>\n \
+<tr><td><b>Action:</b></td><td>{0}</td></tr>\n \
+</table><br />\n \
+<span style="color:red">Action <b>{0}</b> cannot be completed because the user 
session has expired.</span>\n \
+</body></html>\n
+
+PageFlow_SessionExpiredException_Message= \
+Action {0} in page flow {1} cannot be completed because the user session has 
expired.
+
 PageFlow_ControlFieldInitializationException_Page= \
 <html><head><title>Page Flow Error - Control Field 
Initialization</title></head>\n \
 <body>\n \

Modified: incubator/beehive/trunk/netui/src/util/schema/netui-config.xsd
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/src/util/schema/netui-config.xsd?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/src/util/schema/netui-config.xsd&r1=110052&p2=incubator/beehive/trunk/netui/src/util/schema/netui-config.xsd&r2=110053
==============================================================================
--- incubator/beehive/trunk/netui/src/util/schema/netui-config.xsd      
(original)
+++ incubator/beehive/trunk/netui/src/util/schema/netui-config.xsd      Mon Dec 
 6 16:11:44 2004
@@ -80,6 +80,7 @@
             <xsd:element name="max-forwards-per-request" type="xsd:int" 
minOccurs="0" maxOccurs="1" default="25"/>
             <xsd:element name="max-nesting-stack-depth" type="xsd:int" 
minOccurs="0" maxOccurs="1" default="10"/> 
             <xsd:element name="ensure-secure-forwards" type="xsd:boolean" 
minOccurs="0" maxOccurs="1" default="false"/> 
+            <xsd:element name="throw-session-expired-exception" 
type="xsd:boolean" minOccurs="0" maxOccurs="1" default="true"/>
             <xsd:element name="multipart-handler" minOccurs="0" maxOccurs="1" 
default="disabled">
                 <xsd:simpleType>
                     <xsd:restriction base="xsd:string">

Modified: 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/MockPortalListenTo.xml
Url: 
http://svn.apache.org/viewcvs/incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/MockPortalListenTo.xml?view=diff&rev=110053&p1=incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/MockPortalListenTo.xml&r1=110052&p2=incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/MockPortalListenTo.xml&r2=110053
==============================================================================
--- 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/MockPortalListenTo.xml
    (original)
+++ 
incubator/beehive/trunk/netui/test/webapps/drt/testRecorder/tests/MockPortalListenTo.xml
    Mon Dec  6 16:11:44 2004
@@ -456,7 +456,7 @@
     <body>
         handled bothHave
         <br>
-        <font color="blue"><span>Note: doing nothing for action 
/onlyA.</span></font>
+        <font color="blue"><span>Note: doing nothing for action 
onlyA.</span></font>
         <br>
         <a 
href="/coreWeb/mockportal/listenTo/ListenToPortal.jsp?b1altAction=begin&b1_submit=true">start
 over</a>
     </body>

Reply via email to