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>
