@Override
public void encodeEnd(FacesContext facesContext, UIComponent component) throws IOException {
UIPage page = (UIPage) component;
TobagoResponseWriter writer = HtmlRendererUtils.getTobagoResponseWriter(facesContext);
writer.endElement(HtmlElements.DIV);
// write popup components
// beware of ConcurrentModificationException in cascading popups!
// no foreach
UIPopup[] popupArray = FacesContextUtils.getPopups(facesContext).toArray(
new UIPopup[FacesContextUtils.getPopups(facesContext).size()]);
for (UIPopup popup : popupArray) {
RenderUtils.encode(facesContext, popup);
}
String clientId = page.getClientId(facesContext);
final boolean debugMode = VariableResolverUtils.resolveClientProperties(facesContext).isDebugMode();
// avoid submit page in ie if the form contains only one input and you press the enter key in the input
if (VariableResolverUtils.resolveClientProperties(facesContext).getUserAgent().isMsie()) {
writer.startElement(HtmlElements.INPUT, null);
writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.TEXT, false);
writer.writeAttribute(HtmlAttributes.NAME, "tobago.dummy", false);
writer.writeAttribute(HtmlAttributes.TABINDEX, "-1", false);
writer.writeAttribute(HtmlAttributes.STYLE, "visibility:hidden;display:none;", false);
writer.endElement(HtmlElements.INPUT);
}
List<String> messageClientIds = AjaxInternalUtils.getMessagesClientIds(facesContext);
if (messageClientIds != null) {
writer.startElement(HtmlElements.INPUT, null);
writer.writeAttribute(HtmlAttributes.VALUE, StringUtils.join(messageClientIds, ','), true);
writer.writeAttribute(HtmlAttributes.ID, clientId + ComponentUtils.SUB_SEPARATOR + "messagesClientIds", false);
writer.writeAttribute(HtmlAttributes.NAME, clientId + ComponentUtils.SUB_SEPARATOR + "messagesClientIds", false);
writer.writeAttribute(HtmlAttributes.TYPE, HtmlInputTypes.HIDDEN, false);
writer.endElement(HtmlElements.INPUT);
}
// placeholder for menus
writer.startElement(HtmlElements.DIV, page);
writer.writeClassAttribute(Classes.create(page, "menuStore"));
writer.endElement(HtmlElements.DIV);
Application application = facesContext.getApplication();
ViewHandler viewHandler = application.getViewHandler();
writer.startElement(HtmlElements.SPAN, null);
writer.writeIdAttribute(clientId + ComponentUtils.SUB_SEPARATOR + "jsf-state-container");
writer.flush();
if (!FacesContextUtils.isAjax(facesContext)) {
if (FacesVersion.supports12()) {
viewHandler.writeState(facesContext);
} else {
// catch the next written stuff into a string and look if it is empty (TOBAGO-909)
FastStringWriter buffer = new FastStringWriter(40); // usually only the marker...
TobagoResponseWriter originalWriter = (TobagoResponseWriter) facesContext.getResponseWriter();
writer = (TobagoResponseWriter) writer.cloneWithWriter(buffer);
facesContext.setResponseWriter(writer);
viewHandler.writeState(facesContext);
final String stateContent = buffer.toString();
writer = originalWriter;