As far as I can tell, Mojarra does this:
1. Execute before phase listeners.
2. If responseComplete is called by a before phase listener, skip
execution of the phase.
3. If any exceptions were thrown by a before phase listener, queue the
exception.
4. Execute after phase listeners
5. Skip the rest of the lifecycle.
From Phase.java:
try {
handleBeforePhase(context, listeners, event);
if (!shouldSkip(context)) {
execute(context);
}
} catch (Throwable e) {
queueException(context, e);
} finally {
try {
handleAfterPhase(context, listeners, event);
} catch (Throwable e) {
queueException(context, e);
}
So the only processing that occurs after responseComplete is:
- Exception handling
- After phase listener execution
This seems reasonable/expected to me.
Lincoln -
Based on the stack below it looks like FacesContext.release() has been
called from a before phase listener. Is that true? Why/where is
release() being called?
Andy
Dan Allen wrote:
Since the specification doesn't make an exception for this case,
I
would say that this is an inconsistency in the implementation. I
recommend creating an issue report in Mojarra.
-Dan
On Sun, Sep 6, 2009 at 12:00 PM, Lincoln Baxter, III
<lincolnbaxter(a)gmail.com <mailto:lincolnbaxter@gmail.com>> wrote:
If the current response has already been completed before
RESTORE_VIEW phase (eg, because a PhaseListener called
facesContext.responseComplete() beforePhase ), Faces continues to
attempt lifecycle processing. I'm thinking that this should be
handled by halting lifecycle processing as defined in the API --
Is this a bug or a something we need to discuss? What do you guys
think?
/**
* <p>Signal the JavaServer Faces implementation that the HTTP
response
* for this request has already been generated (such as an
HTTP redirect),
* and that the request processing lifecycle should be
terminated as soon
* as the current phase is completed.</p>
*
* @throws IllegalStateException if this method is called after
* this instance has been released
*/
public abstract void responseComplete();
Caused by: java.lang.IllegalStateException
at
com.sun.faces.context.FacesContextImpl.assertNotReleased(FacesContextImpl.java:639)
at
com.sun.faces.context.FacesContextImpl.getCurrentPhaseId(FacesContextImpl.java:515)
at
javax.faces.event.ExceptionQueuedEventContext.<init>(ExceptionQueuedEventContext.java:148)
at
javax.faces.event.ExceptionQueuedEventContext.<init>(ExceptionQueuedEventContext.java:101)
at com.sun.faces.lifecycle.Phase.queueException(Phase.java:152)
at com.sun.faces.lifecycle.Phase.queueException(Phase.java:145)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:105)
at
com.sun.faces.lifecycle.RestoreViewPhase.doPhase(RestoreViewPhase.java:110)
at
com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:310)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
--
*Lincoln Baxter, III*
Co-Founder of OcpSoft <
http://ocpsoft.com>
Author of PrettyFaces <
http://ocpsoft.com/prettyfaces> URL
Rewriting for JSF
--
Dan Allen
Senior Software Engineer, Red Hat | Author of Seam in Action
Registered Linux User #231597
http://mojavelinux.com
http://mojavelinux.com/seaminaction
http://in.relation.to/Bloggers/Dan