/**
* Copyright (C) 2009 eXo Platform SAS.
*
* This 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 2.1 of
* the License, or (at your option) any later version.
*
* This software 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 this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.webui.form;
import java.io.Writer;
import java.util.List;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import org.exoplatform.commons.serialization.api.annotations.Serialized;
import org.exoplatform.commons.utils.HTMLEntityEncoder;
import org.exoplatform.webui.CSRFTokenUtil;
import org.exoplatform.webui.application.WebuiRequestContext;
import org.exoplatform.webui.application.portlet.PortletRequestContext;
import org.exoplatform.webui.bean.BeanDataMapping;
import org.exoplatform.webui.bean.ReflectionDataMapping;
import org.exoplatform.webui.config.Event;
import org.exoplatform.webui.core.UIComponent;
import org.exoplatform.webui.core.UIContainer;
import org.exoplatform.webui.form.input.UICheckBoxInput;
/** Created by The eXo Platform SARL Author : Dang Van Minh minhdv81@yahoo.com Jun 6, 2006 */
@Serialized
public class UIForm extends UIContainer {
public static final String ACTION = "formOp";
public static final String SUBCOMPONENT_ID = "subComponentId";
private static final String GTN_PREFIX = "gtn";
// private List<Validator> validators ;
private String[] actions_ = null;
private String submitAction_;
private boolean multipart_ = false;
private transient BeanDataMapping beanMapping = null;
public UIForm addUIFormInput(UIFormInput input) {
addChild((UIComponent) input);
return this;
}
public UIForm addUIFormInput(UIFormInputSet input) {
addChild(input);
return this;
}
public UIForm addUIComponentInput(UIComponent input) {
addChild(input);
return this;
}
// public UIForm addValidator(Class clazz) throws Exception {
// if(validators == null) validators = new ArrayList<Validator>(3) ;
// validators.add((Validator)clazz.newInstance()) ;
// return this ;
// }
public boolean isMultipart() {
return multipart_;
}
public void setMultiPart(boolean b) {
multipart_ = b;
}
public String getSubmitAction() {
return submitAction_;
}
public void setSubmitAction(String s) {
submitAction_ = s;
}
// public List<Validator> getValidators() { return validators ; }
@SuppressWarnings("unchecked")
public <T extends UIFormInput> T getUIInput(String name) {
return (T) findComponentById(name);
}
public UIFormStringInput getUIStringInput(String name) {
return findComponentById(name);
}
public UIFormCheckBoxInput getUIFormCheckBoxInput(String name) {
return findComponentById(name);
}
public UICheckBoxInput getUICheckBoxInput(String name) {
return findComponentById(name);
}
public UIFormSelectBox getUIFormSelectBox(String name) {
return findComponentById(name);
}
public UIFormInputInfo getUIFormInputInfo(String name) {
return findComponentById(name);
}
public UIFormTextAreaInput getUIFormTextAreaInput(String name) {
return findComponentById(name);
}
public UIFormDateTimeInput getUIFormDateTimeInput(String name) {
return findComponentById(name);
}
public void reset() {
for (UIComponent uiChild : getChildren()) {
if (uiChild instanceof UIFormInput) {
((UIFormInput) uiChild).reset();
}
}
}
public void invokeGetBindingBean(Object bean) throws Exception {
if (beanMapping == null) {
beanMapping = ReflectionDataMapping.getInstance();
}
beanMapping.mapField(this, bean);
}
public void invokeSetBindingBean(Object bean) throws Exception {
if (beanMapping == null) {
beanMapping = ReflectionDataMapping.getInstance();
}
beanMapping.mapBean(bean, this);
}
@SuppressWarnings("unchecked")
public void begin() throws Exception {
WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
String b = context.getURLBuilder().createURL(this, null, null);
Writer writer = context.getWriter();
writer.append("<form class=\"UIForm\" id=\"").append(getId()).append("\" action=\"").append(b).append('\"');
if (getSubmitAction() != null) {
writer.append(" onsubmit=\"").append(HTMLEntityEncoder.getInstance().encodeHTMLAttribute(getSubmitAction())).append("\"");
}
if (multipart_) {
writer.append(" enctype=\"multipart/form-data\"");
}
writer.append(" method=\"post\">");
writer.append("<div><input type=\"hidden\" name=\"").append(ACTION).append("\" value=\"\"/>");
writer.append("<input type=\"hidden\" name=\"").append(CSRFTokenUtil.CSRF_TOKEN).append("\" value=\"");
writer.append(CSRFTokenUtil.getToken());
writer.append("\"/></div>");
}
@Override
public void processRender(WebuiRequestContext context) throws Exception {
if (getTemplate() != null) {
super.processRender(context);
return;
}
Writer writer = context.getWriter();
writer.append("<div class='UIForm ").append(getId()).append("'>");
begin();
renderChildren(context);
end();
writer.append("</div>");
}
public void end() throws Exception {
WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
context.getWriter().write("</form>");
}
public void setActions(String[] actions) {
actions_ = actions;
}
public String[] getActions() {
if (actions_ != null) {
return actions_;
}
List<Event> events = config.getEvents();
actions_ = new String[events.size()];
for (int i = 0; i < actions_.length; i++) {
actions_[i] = events.get(i).getName();
}
return actions_;
}
public void renderField(String name) throws Exception {
UIComponent uiInput = findComponentById(name);
renderField(uiInput);
}
public void renderField(UIComponent uiInput) throws Exception {
WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
uiInput.processRender(context);
}
private String getFormId() {
WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
if (context instanceof PortletRequestContext) {
return new StringBuilder().append(GTN_PREFIX).append(((PortletRequestContext) context).getWindowId())
.append("#").append(getId()).toString();
}
return getId();
}
public String url(String name) throws Exception {
StringBuilder b = new StringBuilder();
b.append("javascript:eXo.webui.UIForm.submitForm('").append(getFormId()).append("','");
b.append(name).append("',false)");
return b.toString();
}
public String event(String name) throws Exception {
StringBuilder b = new StringBuilder();
b.append("javascript:eXo.webui.UIForm.submitForm('").append(getFormId()).append("','");
b.append(name).append("',true)");
return b.toString();
}
public String event(String name, String beanId) throws Exception {
StringBuilder b = new StringBuilder();
b.append("javascript:eXo.webui.UIForm.submitEvent('").append(getFormId()).append("','");
b.append(name).append("','");
b.append("&").append(OBJECTID).append("=").append(beanId).append("')");
return b.toString();
}
public String event(String name, String componentId, String beanId) throws Exception {
StringBuilder b = new StringBuilder();
// TODO: Tung.Pham modified
// ------------------------
b.append("javascript:");
WebuiRequestContext rcontext = WebuiRequestContext.getCurrentInstance();
UIComponent subComponent = findComponentById(componentId);
org.exoplatform.webui.config.Event event = subComponent.getComponentConfig().getUIComponentEventConfig(name);
if (event == null) {
return "??config??";
}
String confirm = event.getConfirm();
if (confirm != null && confirm.trim().length() > 0) {
try {
confirm = rcontext.getApplicationResourceBundle().getString(confirm);
} catch (MissingResourceException exp) {
confirm = confirm.substring(confirm.lastIndexOf('.') + 1);
}
b.append("if(confirm('").append(confirm.replaceAll("'", "\\\\'")).append("'))");
}
b.append("eXo.webui.UIForm.submitEvent('").append(getFormId()).append("','");
// b.append("javascript:eXo.webui.UIForm.submitEvent('").append(getId()).append("','");
// -------------------------
b.append(name).append("','");
b.append("&").append(SUBCOMPONENT_ID).append("=").append(componentId);
if (beanId != null) {
b.append("&").append(OBJECTID).append("=").append(beanId);
}
b.append("')");
return b.toString();
}
public String getLabel(String id) throws Exception {
WebuiRequestContext context = WebuiRequestContext.getCurrentInstance();
ResourceBundle res = context.getApplicationResourceBundle();
return getLabel(res, id);
}
public String getLabel(ResourceBundle res, String id) {
String label = getId() + ".label." + id;
try {
return res.getString(label);
} catch (MissingResourceException e) {
return id;
}
}
public String getUIComponentName() {
return "uiform";
}
}