ResponseWriter writer = origWriter.cloneWithWriter(stateWriter);
context.setResponseWriter(writer);
// force creation of session if saving state there
StateManager stateMgr = context.getApplication().getStateManager();
if (!stateMgr.isSavingStateInClient(context)) {
context.getExternalContext().getSession(true);
}
long time = System.currentTimeMillis();
// render the view to the response
writer.startDocument();
if (FacesAPI.getVersion() >= 12) {
viewToRender.encodeAll(context);
} else {
ComponentSupport.encodeRecursive(context, viewToRender);
}
writer.endDocument();
// finish writing
writer.close();
// remove transients for older versions
if (FacesAPI.getVersion() < 12) {
ComponentSupport.removeTransient(viewToRender);
}
boolean writtenState = stateWriter.isStateWritten();
// flush to origWriter
if (writtenState) {
String content = stateWriter.getAndResetBuffer();
int end = content.indexOf(STATE_KEY);
// See if we can find any trace of the saved state.
// If so, we need to perform token replacement
if (end >= 0) {
// save state
Object stateObj = stateMgr.saveSerializedView(context);
String stateStr;
if (stateObj == null) {
stateStr = null;
} else {
stateMgr.writeState(context,
(StateManager.SerializedView) stateObj);
stateStr = stateWriter.getAndResetBuffer();
}
int start = 0;
while (end != -1) {
origWriter.write(content, start, end - start);
if (stateStr != null) {
origWriter.write(stateStr);
}
start = end + STATE_KEY_LEN;
end = content.indexOf(STATE_KEY, start);
}
origWriter.write(content, start, content.length() - start);
// No trace of any saved state, so we just need to flush
// the buffer
} else {
origWriter.write(content);
// But for JSF 1.1 (actually, just 1.1_01 RI), if we didn't
// detect any saved state, force a call to
// saveSerializedView() in case we're using the old
// pure-server-side state saving
if ((FacesAPI.getVersion() < 12)
&& !stateMgr.isSavingStateInClient(context)) {
stateMgr.saveSerializedView(context);
}
}
}
time = System.currentTimeMillis() - time;