/** * Copyright © 2002 Instituto Superior Técnico * * This file is part of FenixEdu Academic. * * FenixEdu Academic is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * FenixEdu Academic is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with FenixEdu Academic. If not, see <http://www.gnu.org/licenses/>. */ package org.fenixedu.academic.ui.faces.components.util; import java.io.IOException; import java.util.List; import javax.faces.component.UIComponent; import javax.faces.component.UIForm; import javax.faces.component.UIParameter; import javax.faces.context.FacesContext; import javax.faces.context.ResponseWriter; import javax.servlet.http.HttpServletRequest; public class JsfRenderUtils { // TODO: Refactor this method and addHiddenFieldForParameterIfNotExists public static void addEventHandlingHiddenFieldsIfNotExists(FacesContext context, UIComponent component) throws IOException { HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest(); UIForm parentForm = findForm(component); String parentFormClientId = parentForm.getClientId(context); String eventSenderHiddenFieldFinalId = getEventSenderHiddenFieldId(parentFormClientId); String eventSenderHiddenFieldRenderedAttribute = getEventSenderHiddenFieldRenderedAttributeName(parentFormClientId); String eventArgumentHiddenFieldFinalId = getEventArgumentHiddenFieldId(parentFormClientId); String eventArgumentHiddenFieldRenderedAttribute = getEventArgumentHiddenFieldRenderedAttributeName(parentFormClientId); ResponseWriter writer = context.getResponseWriter(); if (request.getAttribute(eventSenderHiddenFieldRenderedAttribute) == null) { renderEmptyHiddenField(eventSenderHiddenFieldFinalId, writer); request.setAttribute(eventSenderHiddenFieldRenderedAttribute, true); } if (request.getAttribute(eventArgumentHiddenFieldRenderedAttribute) == null) { renderEmptyHiddenField(eventArgumentHiddenFieldFinalId, writer); request.setAttribute(eventArgumentHiddenFieldRenderedAttribute, true); } } private static void renderEmptyHiddenField(String clientId, ResponseWriter writer) throws IOException { writer.startElement("input", null); writer.writeAttribute("type", "hidden", null); writer.writeAttribute("id", clientId, null); writer.writeAttribute("name", clientId, null); writer.writeAttribute("value", "", null); writer.endElement("input"); } public static String getEventSenderHiddenFieldId(String formClientId) { String eventSenderHiddenFieldFinalId = formClientId + JsfRenderConstants.EVENT_SENDER_HIDDEN_FIELD_SUFFIX; return eventSenderHiddenFieldFinalId; } public static String getEventArgumentHiddenFieldId(String formClientId) { String eventArgumentHiddenFieldFinalId = formClientId + JsfRenderConstants.EVENT_ARGUMENT_HIDDEN_FIELD_SUFFIX; return eventArgumentHiddenFieldFinalId; } public static String getEventSenderHiddenFieldRenderedAttributeName(String formClientId) { String eventSenderHiddenFieldRenderedAttributeName = formClientId + JsfRenderConstants.EVENT_SENDER_HIDDEN_FIELD_RENDERED_SUFFIX; return eventSenderHiddenFieldRenderedAttributeName; } public static String getEventArgumentHiddenFieldRenderedAttributeName(String formClientId) { String eventArgumentHiddenFieldRenderedAttributeName = formClientId + JsfRenderConstants.EVENT_ARGUMENT_HIDDEN_FIELD_RENDERED_SUFFIX; return eventArgumentHiddenFieldRenderedAttributeName; } public static UIForm findForm(UIComponent component) { UIComponent formCandidate = component.getParent(); while (formCandidate != null && !(formCandidate instanceof UIForm)) { formCandidate = formCandidate.getParent(); } return (UIForm) formCandidate; } public static String getSubmitJavaScript(FacesContext context, UIComponent component) { UIForm parentForm = findForm(component); String parentFormClientId = parentForm.getClientId(context); String componentClientId = component.getClientId(context); String eventSenderHiddenFieldId = getEventSenderHiddenFieldId(parentFormClientId); StringBuilder onClickEvent = new StringBuilder(); onClickEvent.append("document.forms['").append(parentFormClientId).append("'].elements['"); onClickEvent.append(eventSenderHiddenFieldId).append("'].value='").append(componentClientId); onClickEvent.append("';document.forms['").append(parentFormClientId).append("'].submit();"); return onClickEvent.toString(); } public static String getSubmitJavaScriptWithArgument(FacesContext context, UIComponent component, String eventArgument) { UIForm parentForm = findForm(component); String parentFormClientId = parentForm.getClientId(context); String componentClientId = component.getClientId(context); String eventSenderHiddenFieldId = getEventSenderHiddenFieldId(parentFormClientId); String eventArgumentHiddenFieldId = getEventArgumentHiddenFieldId(parentFormClientId); StringBuilder onClickEvent = new StringBuilder(); onClickEvent.append("document.forms['").append(parentFormClientId).append("'].elements['"); onClickEvent.append(eventSenderHiddenFieldId).append("'].value='").append(componentClientId).append("';"); onClickEvent.append("document.forms['").append(parentFormClientId).append("'].elements['"); onClickEvent.append(eventArgumentHiddenFieldId).append("'].value='").append(eventArgument).append("';"); onClickEvent.append("document.forms['").append(parentFormClientId).append("'].submit();"); return onClickEvent.toString(); } /** * * @param context * @param component * @param uiParameterList * @return */ public static String getSubmitJavaScriptWithParameters(FacesContext context, UIComponent component, List<UIParameter> uiParameterList) { UIForm parentForm = findForm(component); String parentFormClientId = parentForm.getClientId(context); String componentClientId = component.getClientId(context); String eventSenderHiddenFieldId = getEventSenderHiddenFieldId(parentFormClientId); StringBuilder setParametersJavaScript = new StringBuilder(); for (int i = 0; i < uiParameterList.size(); i++) { UIParameter parameter = uiParameterList.get(i); setParametersJavaScript.append("document.forms['").append(parentFormClientId).append("'].elements['") .append(parameter.getName()).append("'].value='").append(parameter.getValue()).append("';"); } StringBuilder onClickEvent = new StringBuilder(); onClickEvent.append("document.forms['").append(parentFormClientId).append("'].elements['"); onClickEvent.append(eventSenderHiddenFieldId).append("'].value='").append(componentClientId).append("';"); onClickEvent.append(setParametersJavaScript.toString()); onClickEvent.append("document.forms['").append(parentFormClientId).append("'].submit();"); return onClickEvent.toString(); } // TODO: Refactor this method and addEventHandlingHiddenFieldsIfNotExists to // a single method (addHiddenFieldIfNotExists) private static void addHiddenFieldForParameterIfNotExists(String parentFormClientId, HttpServletRequest request, ResponseWriter writer, String parameterName) throws IOException { String renderedAttribute = parentFormClientId + parameterName + JsfRenderConstants.PARAMETER_HIDDEN_FIELD_RENDERED_SUFFIX; if (request.getAttribute(renderedAttribute) == null) { renderEmptyHiddenField(parameterName, writer); request.setAttribute(renderedAttribute, true); } } public static void addHiddenFieldsForParametersIfNotExists(FacesContext context, UIComponent parentComponent, List<UIParameter> uiParameters) throws IOException { UIForm parentForm = findForm(parentComponent); String parentFormClientId = parentForm.getClientId(context); ResponseWriter writer = context.getResponseWriter(); HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest(); for (int i = 0; i < uiParameters.size(); i++) { UIParameter parameter = uiParameters.get(i); addHiddenFieldForParameterIfNotExists(parentFormClientId, request, writer, parameter.getName()); } } public static String getClearEventSenderFieldJavaScript(FacesContext context, UIComponent component) { UIForm parentForm = findForm(component); String parentFormClientId = parentForm.getClientId(context); String eventSenderHiddenFieldId = getEventSenderHiddenFieldId(parentFormClientId); StringBuilder clearEventSenderFieldJavaScript = new StringBuilder(); clearEventSenderFieldJavaScript.append("document.forms['").append(parentFormClientId).append("'].elements['") .append(eventSenderHiddenFieldId).append("'].value='';"); return clearEventSenderFieldJavaScript.toString(); } }