if (log.isLoggable(Level.FINEST))
log.finest("View is not rendered");
return;
}
ExternalContext externalContext = context.getExternalContext();
String viewId = context.getViewRoot().getViewId();
if (log.isLoggable(Level.FINEST))
log.finest("Rendering JSP view: " + viewId);
// handle character encoding as of section 2.5.2.2 of JSF 1.1
if(null != externalContext.getSession(false))
{
externalContext.getSessionMap().put(ViewHandler.CHARACTER_ENCODING_KEY, externalContext.getResponseCharacterEncoding());
}
// render the view in this method (since JSF 1.2)
RenderKitFactory renderFactory = (RenderKitFactory) FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
RenderKit renderKit = renderFactory.getRenderKit(context, view.getRenderKitId());
ResponseWriter responseWriter = context.getResponseWriter();
if (responseWriter == null)
{
responseWriter = renderKit.createResponseWriter(externalContext.getResponseOutputWriter(), null, externalContext.getRequestCharacterEncoding());
context.setResponseWriter(responseWriter);
}
ResponseWriter oldResponseWriter = responseWriter;
StringWriter stateAwareWriter = null;
StateManager stateManager = context.getApplication().getStateManager();
if (stateManager.isSavingStateInClient(context))
{
stateAwareWriter = new StringWriter();
// Create a new response-writer using as an underlying writer the stateAwareWriter
// Effectively, all output will be buffered in the stateAwareWriter so that later
// this writer can replace the state-markers with the actual state.
responseWriter = oldResponseWriter.cloneWithWriter(stateAwareWriter);
context.setResponseWriter(responseWriter);
}
actuallyRenderView(context, view);
if(oldResponseWriter != null)
{
context.setResponseWriter(oldResponseWriter);
}
// We're done with the document - now we can write all content
// to the response, properly replacing the state-markers on the way out
// by using the stateAwareWriter
if (stateManager.isSavingStateInClient(context))
{
flushBufferToWriter(stateAwareWriter.getBuffer(), externalContext.getResponseOutputWriter());
}
else
{
stateManager.saveView(context);
}
// Final step - we output any content in the wrappedResponse response from above to the response,
// removing the wrappedResponse response from the request, we don't need it anymore
ViewResponseWrapper afterViewTagResponse = (ViewResponseWrapper) externalContext.getRequestMap()
.get(AFTER_VIEW_TAG_CONTENT_PARAM);
externalContext.getRequestMap().remove(AFTER_VIEW_TAG_CONTENT_PARAM);
if (afterViewTagResponse != null)
{
afterViewTagResponse.flushToWriter(externalContext.getResponseOutputWriter(), externalContext.getResponseCharacterEncoding());
}
//TODO sobryan: Is this right?
context.getResponseWriter().flush();
}