Description
Every phase in LifecycleImpl looks like:
private boolean applyRequestValues(FacesContext facesContext, PhaseListenerManager phaseListenerMgr)
throws FacesException
{
boolean skipFurtherProcessing = false;
if (log.isTraceEnabled()) log.trace("entering applyRequestValues in " + LifecycleImpl.class.getName());
try {
phaseListenerMgr.informPhaseListenersBefore(PhaseId.APPLY_REQUEST_VALUES);
if(isResponseComplete(facesContext, "applyRequestValues", true))
{ // have to return right away return true; }if(shouldRenderResponse(facesContext, "applyRequestValues", true))
{ skipFurtherProcessing = true; } facesContext.getViewRoot().processDecodes(facesContext);
} finally
if (isResponseComplete(facesContext, "applyRequestValues", false)
shouldRenderResponse(facesContext, "applyRequestValues", false)) { // since this phase is completed we don't need to return right away even if the response is completed skipFurtherProcessing = true; } |
---|
if (!skipFurtherProcessing && log.isTraceEnabled())
log.trace("exiting applyRequestValues in "
+ LifecycleImpl.class.getName());
return skipFurtherProcessing;
}
And that is repeated as many times as phases are. The fix will be to extract the common behavior in a method, that receives one additional parameter - PhaseExecutor and delegate to it the real execution.