/* * Copyright (C) 2003-2008 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.ecm.webui.form; import java.io.InputStream; import java.io.Writer; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.Set; import javax.jcr.ItemNotFoundException; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.PathNotFoundException; import javax.jcr.PropertyType; import javax.jcr.RepositoryException; import javax.jcr.Session; import javax.jcr.Value; import javax.jcr.ValueFormatException; import javax.jcr.lock.LockException; import org.apache.commons.lang.StringUtils; import org.exoplatform.commons.utils.IOUtil; import org.exoplatform.download.DownloadService; import org.exoplatform.download.InputStreamDownloadResource; import org.exoplatform.ecm.resolver.JCRResourceResolver; import org.exoplatform.ecm.webui.core.fckconfig.FCKConfigService; import org.exoplatform.ecm.webui.core.fckconfig.FCKEditorContext; import org.exoplatform.ecm.webui.form.field.UIFormActionField; import org.exoplatform.ecm.webui.form.field.UIFormCalendarField; import org.exoplatform.ecm.webui.form.field.UIFormCheckBoxField; import org.exoplatform.ecm.webui.form.field.UIFormHiddenField; import org.exoplatform.ecm.webui.form.field.UIFormRadioBoxField; import org.exoplatform.ecm.webui.form.field.UIFormRichtextField; import org.exoplatform.ecm.webui.form.field.UIFormSelectBoxField; import org.exoplatform.ecm.webui.form.field.UIFormTextAreaField; import org.exoplatform.ecm.webui.form.field.UIFormTextField; import org.exoplatform.ecm.webui.form.field.UIFormUploadField; import org.exoplatform.ecm.webui.form.field.UIFormWYSIWYGField; import org.exoplatform.ecm.webui.form.field.UIMixinField; import org.exoplatform.ecm.webui.form.validator.UploadFileMimeTypesValidator; import org.exoplatform.ecm.webui.utils.DialogFormUtil; import org.exoplatform.ecm.webui.utils.JCRExceptionManager; import org.exoplatform.ecm.utils.lock.LockUtil; import org.exoplatform.ecm.webui.utils.Utils; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.services.cms.BasePath; import org.exoplatform.services.cms.JcrInputProperty; import org.exoplatform.services.cms.impl.DMSConfiguration; import org.exoplatform.services.cms.scripts.CmsScript; import org.exoplatform.services.cms.scripts.ScriptService; import org.exoplatform.services.cms.templates.TemplateService; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.core.ManageableRepository; import org.exoplatform.services.jcr.ext.hierarchy.NodeHierarchyCreator; import org.exoplatform.services.jcr.util.Text; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.wcm.core.NodetypeConstant; import org.exoplatform.services.wcm.utils.WCMCoreUtils; import org.exoplatform.webui.form.UIFormRichtextInput; import org.exoplatform.web.application.ApplicationMessage; import org.exoplatform.web.application.RequestContext; import org.exoplatform.webui.application.WebuiRequestContext; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.ComponentConfigs; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIApplication; import org.exoplatform.webui.core.UIComponent; import org.exoplatform.webui.core.model.SelectItemOption; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.Event.Phase; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.form.UIForm; import org.exoplatform.webui.form.UIFormDateTimeInput; import org.exoplatform.webui.form.UIFormInput; import org.exoplatform.webui.form.UIFormInputBase; import org.exoplatform.webui.form.UIFormMultiValueInputSet; import org.exoplatform.webui.form.UIFormRadioBoxInput; import org.exoplatform.webui.form.UIFormSelectBox; import org.exoplatform.webui.form.UIFormStringInput; import org.exoplatform.webui.form.UIFormTextAreaInput; import org.exoplatform.webui.form.input.UICheckBoxInput; import org.exoplatform.webui.form.input.UIUploadInput; import org.exoplatform.webui.form.wysiwyg.FCKEditorConfig; import org.exoplatform.webui.form.wysiwyg.UIFormWYSIWYGInput; /** * Created by The eXo Platform SAS * @author : Hoa.Pham * hoa.pham@exoplatform.com * Jun 23, 2008 */ @ComponentConfigs( { @ComponentConfig(type = UIFormMultiValueInputSet.class, id = "WYSIWYGRichTextMultipleInputset", events = { @EventConfig(listeners = UIDialogForm.AddActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIFormMultiValueInputSet.RemoveActionListener.class, phase = Phase.DECODE) }) }) @SuppressWarnings("unused") public class UIDialogForm extends UIForm { /** * Logger. */ private static final Log LOG = ExoLogger.getLogger(UIDialogForm.class.getName()); private final String REPOSITORY = "repository"; protected final static String CANCEL_ACTION = "Cancel"; protected final static String SAVE_ACTION = "Save"; protected static final String SAVE_AND_CLOSE = "SaveAndClose"; protected static final String[] ACTIONS = { SAVE_ACTION, CANCEL_ACTION }; private static final String WYSIWYG_MULTI_ID = "WYSIWYGRichTextMultipleInputset"; protected Map<String, Map<String,String>> componentSelectors = new HashMap<String, Map<String,String>>(); protected Map<String, String> fieldNames = new HashMap<String, String>(); protected Map<String, String> propertiesName = new HashMap<String, String>(); protected Map<String, String[]> uiMultiValueParam = new HashMap<String, String[]>(); protected String contentType; protected boolean isAddNew = true; protected boolean isRemovePreference; protected boolean isRemoveActionField; protected boolean isShowingComponent; protected boolean isUpdateSelect; protected Map<String, JcrInputProperty> properties = new HashMap<String, JcrInputProperty>(); protected Map<String, String> options = new HashMap<String, String>(); protected String repositoryName; protected JCRResourceResolver resourceResolver; private String childPath; private boolean isNotEditNode; private boolean dataRemoved_ = false;; private boolean isNTFile; private boolean isOnchange; private boolean isResetForm; private boolean isResetMultiField; protected String nodePath; protected String i18nNodePath = null; private List<String> postScriptInterceptor = new ArrayList<String>(); private List<String> prevScriptInterceptor = new ArrayList<String>(); private List<String> listTaxonomy = new ArrayList<String>(); private List<String> removedNodes = new ArrayList<String>(); private String storedPath; protected String workspaceName; protected boolean isReference; protected boolean isShowActionsOnTop_ = false; private List<String> removedBinary ; /** Selected Tab id */ private String selectedTab; private String SEPARATOR_VALUE = "::"; public UIDialogForm() { removedBinary = new ArrayList<String>(); } public boolean isEditing() { return !isAddNew;} public boolean isAddNew() { return isAddNew;} public void addNew(boolean b) { this.isAddNew = b; } private boolean isKeepinglock = false; public void setSelectedTab(String selectedTab) { this.selectedTab = selectedTab; } public String getSelectedTab() { return selectedTab; } public boolean isKeepinglock() { return isKeepinglock; } public void setIsKeepinglock(boolean isKeepinglock) { this.isKeepinglock = isKeepinglock; } public boolean isShowActionsOnTop() { return isShowActionsOnTop_; } public void setShowActionsOnTop(boolean isShowActionsOnTop) { this.isShowActionsOnTop_ = isShowActionsOnTop; } public void releaseLock() throws Exception { if (isKeepinglock()) { Node currentNode = getNode(); if ((currentNode!=null) && currentNode.isLocked()) { try { if(currentNode.holdsLock()) { String lockToken = LockUtil.getLockTokenOfUser(currentNode); if(lockToken != null) { currentNode.getSession().addLockToken(LockUtil.getLockToken(currentNode)); } currentNode.unlock(); currentNode.removeMixin(Utils.MIX_LOCKABLE); currentNode.save(); //remove lock from Cache LockUtil.removeLock(currentNode); } } catch(LockException le) { if (LOG.isErrorEnabled()) { LOG.error("Fails when unlock node that is editing", le); } } } } setIsKeepinglock(false); } public List<String> getListTaxonomy() { return listTaxonomy; } public void setListTaxonomy(List<String> listTaxonomy) { this.listTaxonomy = listTaxonomy; } public void setStoredLocation(String workspace, String storedPath) { try { this.repositoryName = getApplicationComponent(RepositoryService.class).getCurrentRepository() .getConfiguration() .getName(); } catch (RepositoryException ex) { this.repositoryName = null; } setWorkspace(workspace); setStoredPath(storedPath); } protected String getCategoryLabel(String resource) { String[] taxonomyPathSplit = resource.split("/"); StringBuilder buildlabel; StringBuilder buildPathlabel = new StringBuilder(); for (int i = 0; i < taxonomyPathSplit.length; i++) { buildlabel = new StringBuilder("eXoTaxonomies"); for (int j = 0; j <= i; j++) { buildlabel.append(".").append(taxonomyPathSplit[j]); } try { buildPathlabel.append(Utils.getResourceBundle(buildlabel.append(".label").toString())).append("/"); } catch (MissingResourceException me) { buildPathlabel.append(taxonomyPathSplit[i]).append("/"); } } return buildPathlabel.substring(0, buildPathlabel.length() - 1); } public void seti18nNodePath(String nodePath) { i18nNodePath = nodePath; } public String geti18nNodePath() { return i18nNodePath; } @SuppressWarnings("unchecked") public void addActionField(String name,String label,String[] arguments) throws Exception { UIFormActionField formActionField = new UIFormActionField(name,label,arguments); if(formActionField.useSelector()) { componentSelectors.put(name, formActionField.getSelectorInfo()); } String jcrPath = formActionField.getJcrPath(); JcrInputProperty inputProperty = new JcrInputProperty(); inputProperty.setJcrPath(jcrPath); inputProperty.setChangeInJcrPathParam(formActionField.getChangeInJcrPathParam()); setInputProperty(name, inputProperty); Node node = getNode(); UIComponent uiInput; boolean isFirstTimeRender = false; if(formActionField.isMultiValues()) { uiInput = findComponentById(name); if (uiInput == null) { isFirstTimeRender = true; uiInput = addMultiValuesInput(UIFormStringInput.class,name,label); String defaultValue = formActionField.getDefaultValue(); if (defaultValue != null) { if (UIFormMultiValueInputSet.class.isInstance(uiInput)) { String[] arrDefaultValues = defaultValue.split(","); List<String> lstValues = new ArrayList<String>(); for (String itemDefaultValues : arrDefaultValues) { if (!lstValues.contains(itemDefaultValues.trim())) lstValues.add(itemDefaultValues.trim()); } ((UIFormMultiValueInputSet) uiInput).setValue(lstValues); } } } ((UIFormMultiValueInputSet)uiInput).setEditable(formActionField.isEditable()); if (node == null) { renderField(name); return; } } else { uiInput = findComponentById(name); if(uiInput == null) { isFirstTimeRender = true; uiInput = formActionField.createUIFormInput(); addUIFormInput((UIFormInput<?>)uiInput); } ((UIFormStringInput)uiInput).setReadOnly(!formActionField.isEditable()); } String propertyName = getPropertyName(jcrPath); propertiesName.put(name, propertyName); fieldNames.put(propertyName, name); if (node != null && !isShowingComponent && !isRemovePreference && !isRemoveActionField) { if (jcrPath.equals("/node") && (!formActionField.isEditable() || formActionField.isEditableIfNull())) { ((UIFormStringInput) uiInput).setDisabled(true); } } if (node != null && !isShowingComponent && !isRemovePreference && !isRemoveActionField && isFirstTimeRender) { if(jcrPath.equals("/node") && (!formActionField.isEditable() || formActionField.isEditableIfNull())) { ((UIFormStringInput)uiInput).setValue(node.getName()); } else if(node.hasProperty(propertyName) && !isUpdateSelect) { String relPath = ""; String itemRelPath = ""; if (node.getProperty(propertyName).getDefinition().isMultiple()) { StringBuffer buffer = new StringBuffer(); Value[] values = node.getProperty(propertyName).getValues(); if (UIFormStringInput.class.isInstance(uiInput)) { for (Value value : values) { buffer.append(value).append(","); } if (buffer.toString().endsWith(",")) buffer.deleteCharAt(buffer.length() - 1); ((UIFormStringInput) uiInput).setValue(buffer.toString()); } if (UIFormMultiValueInputSet.class.isInstance(uiInput)) { List<String> lstValues = new ArrayList<String>(); for (Value value : values) { lstValues.add(value.getString()); } ((UIFormMultiValueInputSet) uiInput).setValue(lstValues); } } else { String value = node.getProperty(propertyName).getValue().getString(); if (node.getProperty(propertyName).getDefinition().getRequiredType() == PropertyType.REFERENCE) value = getNodePathByUUID(value); ((UIFormStringInput) uiInput).setValue(value); } } } Node childNode = getChildNode(); if(isNotEditNode && !isShowingComponent && !isRemovePreference && !isRemoveActionField) { if(childNode != null) { ((UIFormInput<String>)uiInput).setValue(propertyName); } else if(childNode == null && jcrPath.equals("/node") && node != null) { ((UIFormInput<String>)uiInput).setValue(node.getName()); } else { ((UIFormInput<?>)uiInput).setValue(null); } } renderField(name); } public void addActionField(String name, String[] arguments) throws Exception { addActionField(name,null,arguments); } public void addCalendarField(String name, String label, String[] arguments) throws Exception { UIFormCalendarField calendarField = new UIFormCalendarField(name,label,arguments); String jcrPath = calendarField.getJcrPath(); JcrInputProperty inputProperty = new JcrInputProperty(); inputProperty.setJcrPath(jcrPath); inputProperty.setChangeInJcrPathParam(calendarField.getChangeInJcrPathParam()); setInputProperty(name, inputProperty); if(calendarField.isMultiValues()) { renderMultiValuesInput(UIFormDateTimeInput.class,name,label); return; } boolean isFirstTimeRender = false; UIFormDateTimeInput uiDateTime = findComponentById(name); if (uiDateTime == null) { isFirstTimeRender = true; uiDateTime = calendarField.createUIFormInput(); if (calendarField.validateType != null) { DialogFormUtil.addValidators(uiDateTime, calendarField.validateType); } if (isAddNew && uiDateTime.getCalendar() == null) { uiDateTime.setCalendar(new GregorianCalendar()); } } uiDateTime.setDisplayTime(calendarField.isDisplayTime()); String propertyName = getPropertyName(jcrPath); propertiesName.put(name, propertyName); fieldNames.put(propertyName, name); Node node = getNode(); uiDateTime.setCalendar(uiDateTime.getCalendar()); if(node != null && node.hasProperty(propertyName) && !isShowingComponent && !isRemovePreference) { if (isFirstTimeRender) uiDateTime.setCalendar(node.getProperty(propertyName).getDate()); } Node childNode = getChildNode(); if(isNotEditNode && !isShowingComponent && !isRemovePreference) { if(childNode != null) { if(childNode.hasProperty(propertyName)) { if(childNode.getProperty(propertyName).getDefinition().isMultiple()) { Value[] values = childNode.getProperty(propertyName).getValues(); for(Value value : values) { if (uiDateTime.getDefaultValue() == null) { uiDateTime.setCalendar(value.getDate()); uiDateTime.setDefaultValue(uiDateTime.getValue()); } } } else { uiDateTime.setCalendar(childNode.getProperty(propertyName).getValue().getDate()); } } } else if(childNode == null && jcrPath.equals("/node") && node != null) { uiDateTime.setCalendar(node.getProperty(propertyName).getDate()); } else { uiDateTime.setCalendar(new GregorianCalendar()); } }else{ if((node != null) && node.hasNode("jcr:content") && (childNode == null)) { Node jcrContentNode = node.getNode("jcr:content"); if(jcrContentNode.hasProperty(propertyName)) { if(jcrContentNode.getProperty(propertyName).getDefinition().isMultiple()) { Value[] values = jcrContentNode.getProperty(propertyName).getValues(); for(Value value : values) { if (uiDateTime.getDefaultValue() == null) { uiDateTime.setCalendar(value.getDate()); uiDateTime.setDefaultValue(uiDateTime.getValue()); } } }else{ uiDateTime.setCalendar(jcrContentNode.getProperty(propertyName).getValue().getDate()); } } } } if (findComponentById(name) == null) addUIFormInput(uiDateTime); if(calendarField.isVisible()) renderField(name); } public void addCalendarField(String name, String[] arguments) throws Exception { addCalendarField(name,null,arguments); } public void addHiddenField(String name, String[] arguments) throws Exception { UIFormHiddenField formHiddenField = new UIFormHiddenField(name,null,arguments); String jcrPath = formHiddenField.getJcrPath(); JcrInputProperty inputProperty = formHiddenField.createJcrInputProperty(); inputProperty.setJcrPath(jcrPath); inputProperty.setChangeInJcrPathParam(formHiddenField.getChangeInJcrPathParam()); inputProperty.setValue(formHiddenField.getDefaultValue()); if(formHiddenField.getMixinTypes() != null) inputProperty.setMixintype(formHiddenField.getMixinTypes()); if(formHiddenField.getNodeType() != null ) inputProperty.setNodetype(formHiddenField.getNodeType()); setInputProperty(name, inputProperty); } public void addInterceptor(String scriptPath, String type) { if(scriptPath.length() > 0 && type.length() > 0){ if(type.equals("prev") && !prevScriptInterceptor.contains(scriptPath)){ prevScriptInterceptor.add(scriptPath); } else if(type.equals("post") && !postScriptInterceptor.contains(scriptPath)){ postScriptInterceptor.add(scriptPath); } } } public void addMixinField(String name,String label,String[] arguments) throws Exception { UIMixinField mixinField = new UIMixinField(name,label,arguments); String jcrPath = mixinField.getJcrPath(); String nodetype = mixinField.getNodeType(); String mixintype = mixinField.getMixinTypes(); JcrInputProperty inputProperty = new JcrInputProperty(); inputProperty.setJcrPath(jcrPath); inputProperty.setChangeInJcrPathParam(mixinField.getChangeInJcrPathParam()); if (nodetype != null || mixintype != null) { inputProperty.setType(JcrInputProperty.NODE); if(nodetype != null) inputProperty.setNodetype(nodetype); if(mixintype != null) inputProperty.setMixintype(mixintype); } setInputProperty(name, inputProperty); Node node = getNode(); if(node != null && mixinField.isVisibleIfNotNull()) { UIFormStringInput uiMixin = findComponentById(name); if(uiMixin == null) { uiMixin = mixinField.createUIFormInput(); uiMixin.setValue(node.getName()); addUIFormInput(uiMixin); } else uiMixin.setValue(node.getName()); uiMixin.setReadOnly(true); renderField(name); } } public void addMixinField(String name, String[] arguments) throws Exception { addMixinField(name,null,arguments); } public void addCheckBoxField(String name, String lable, String[] arguments) throws Exception{ UIFormCheckBoxField formCheckBoxField = new UIFormCheckBoxField(name, lable, arguments); String jcrPath = formCheckBoxField.getJcrPath(); String defaultValue = formCheckBoxField.getDefaultValue(); if (defaultValue == null) defaultValue = "false"; JcrInputProperty inputProperty = new JcrInputProperty(); inputProperty.setJcrPath(jcrPath); inputProperty.setChangeInJcrPathParam(formCheckBoxField.getChangeInJcrPathParam()); setInputProperty(name, inputProperty); String propertyName = getPropertyName(jcrPath); propertiesName.put(name, propertyName); fieldNames.put(propertyName, name); Node node = getNode(); Node childNode = getChildNode(); UICheckBoxInput uiCheckBoxInput = findComponentById(name); boolean isFirstTimeRender = false; if(uiCheckBoxInput == null || isResetForm ){ isFirstTimeRender = true; uiCheckBoxInput = new UICheckBoxInput(name, name, null); if (defaultValue != null) { uiCheckBoxInput.setValue(Boolean.parseBoolean(defaultValue)); uiCheckBoxInput.setChecked(Boolean.parseBoolean(defaultValue)); } } if (node != null && node.hasProperty(propertyName) && isFirstTimeRender) { uiCheckBoxInput.setValue(Boolean.parseBoolean(node.getProperty(propertyName).getValue().toString())); uiCheckBoxInput.setChecked(node.getProperty(propertyName).getValue().getBoolean()); }else if( childNode != null && childNode.hasProperty(propertyName) && isFirstTimeRender){ uiCheckBoxInput.setValue(Boolean.parseBoolean(childNode.getProperty(propertyName).getValue().toString())); uiCheckBoxInput.setChecked(childNode.getProperty(propertyName).getValue().getBoolean()); } if (formCheckBoxField.validateType != null) { DialogFormUtil.addValidators(uiCheckBoxInput, formCheckBoxField.validateType); } if(formCheckBoxField.isOnchange()){ uiCheckBoxInput.setOnChange("Onchange"); uiCheckBoxInput.setValue(uiCheckBoxInput.getValue()); } removeChildById(name); addUIFormInput(uiCheckBoxInput); renderField(name); } public void addCheckBoxField(String name, String[] arguments) throws Exception{ addCheckBoxField(name, null, arguments); } public void addRadioBoxField(String name, String label, String[] arguments) throws Exception{ UIFormRadioBoxField formRadioBoxField = new UIFormRadioBoxField(name, label, arguments); String jcrPath = formRadioBoxField.getJcrPath(); String options = formRadioBoxField.getOptions(); String defaultValue = formRadioBoxField.getDefaultValue(); List<SelectItemOption<String>> optionsList = new ArrayList<SelectItemOption<String>>(); UIFormRadioBoxInput uiRadioBox = findComponentById(name); boolean isFirstTimeRender = false; if(uiRadioBox == null){ isFirstTimeRender = true; uiRadioBox = new UIFormRadioBoxInput(name, defaultValue, null); if(options != null && options.length() > 0){ String[] array = options.split(";"); for(int i = 0; i < array.length; i++) { String[] arrayChild = array[i].trim().split(","); for(int j=0; j<arrayChild.length; j++) { optionsList.add(new SelectItemOption<String>(arrayChild[j], arrayChild[j])); } } uiRadioBox.setOptions(optionsList); } else { uiRadioBox.setOptions(optionsList); } if(defaultValue != null) uiRadioBox.setDefaultValue(defaultValue); } addUIFormInput(uiRadioBox); String propertyName = getPropertyName(jcrPath); propertiesName.put(name, propertyName); fieldNames.put(propertyName, name); JcrInputProperty inputProperty = new JcrInputProperty(); inputProperty.setJcrPath(jcrPath); inputProperty.setChangeInJcrPathParam(formRadioBoxField.getChangeInJcrPathParam()); setInputProperty(name, inputProperty); Node node = getNode(); Node childNode = getChildNode(); if(childNode != null) { if(childNode.hasProperty(propertyName) && isFirstTimeRender) { uiRadioBox.setValue(childNode.getProperty(propertyName).getValue().getString()); } } else { if(node != null && node.hasProperty(propertyName) && isFirstTimeRender) { uiRadioBox.setValue(node.getProperty(propertyName).getString()); } } if(isNotEditNode) { Node child = getChildNode(); if(child != null && child.hasProperty(propertyName) && isFirstTimeRender) { uiRadioBox.setValue(DialogFormUtil.getPropertyValueAsString(child,propertyName)); } } renderField(name); } public void addRadioBoxField(String name, String[] arguments) throws Exception{ addRadioBoxField(name, null, arguments); } public void addSelectBoxField(String name, String label, String[] arguments) throws Exception { UIFormSelectBoxField formSelectBoxField = new UIFormSelectBoxField(name,label,arguments); String jcrPath = formSelectBoxField.getJcrPath(); String editable = formSelectBoxField.getEditable(); String onchange = formSelectBoxField.getOnchange(); String defaultValue = formSelectBoxField.getDefaultValue(); String options = formSelectBoxField.getOptions(); String script = formSelectBoxField.getGroovyScript(); if (editable == null) formSelectBoxField.setEditable("true"); List<SelectItemOption<String>> optionsList = new ArrayList<SelectItemOption<String>>(); UIFormSelectBox uiSelectBox = findComponentById(name); boolean isFirstTimeRender = false; if (uiSelectBox == null || isResetForm) { isFirstTimeRender = true; uiSelectBox = new UIFormSelectBox(name, name, null); if (script != null) { try { String[] scriptParams = formSelectBoxField.getScriptParams(); executeScript(script, uiSelectBox, scriptParams, true); } catch (Exception e) { if (LOG.isErrorEnabled()) { LOG.error("An unexpected error occurs", e); } uiSelectBox.setOptions(optionsList); } } else if (options != null && options.length() >0) { String[] array = options.split(","); RequestContext context = RequestContext.getCurrentInstance(); ResourceBundle res = context.getApplicationResourceBundle(); String optionLabel; for(int i = 0; i < array.length; i++) { List<String> listValue = new ArrayList<String>(); String[] arrayChild = array[i].trim().split(SEPARATOR_VALUE); for (int j = 0; j < arrayChild.length; j++) { if (!arrayChild[j].trim().equals("")) { listValue.add(arrayChild[j].trim()); } } try { String tagName = listValue.get(0).replaceAll(" ", "-"); optionLabel = res.getString(tagName); } catch (MissingResourceException e) { optionLabel = listValue.get(0); } if (listValue.size() > 1) { optionsList.add(new SelectItemOption<String>(optionLabel, listValue.get(1))); } else { optionsList.add(new SelectItemOption<String>(optionLabel, listValue.get(0))); } } uiSelectBox.setOptions(optionsList); } else { uiSelectBox.setOptions(optionsList); } if(defaultValue != null) uiSelectBox.setValue(defaultValue); } propertiesName.put(name, getPropertyName(jcrPath)); fieldNames.put(getPropertyName(jcrPath), name); if (formSelectBoxField.validateType != null) { DialogFormUtil.addValidators(uiSelectBox, formSelectBoxField.validateType); } String[] arrNodes = jcrPath.split("/"); Node childNode = null; Node node = getNode(); String propertyName = getPropertyName(jcrPath); if(node != null && arrNodes.length == 4) childNode = node.getNode(arrNodes[2]); if (formSelectBoxField.isMultiValues()) { if (formSelectBoxField.getSize() != null && StringUtils.isAlphanumeric(formSelectBoxField.getSize())) { uiSelectBox.setSize(Integer.parseInt(formSelectBoxField.getSize())); } uiSelectBox.setMultiple(true); StringBuffer buffer = new StringBuffer(); if((childNode != null) && isFirstTimeRender && childNode.hasProperty(propertyName)) { List<String> valueList = new ArrayList<String>(); Value[] values = childNode.getProperty(propertyName).getValues(); for(Value value : values) { buffer.append(value.getString()).append(","); } uiSelectBox.setSelectedValues(StringUtils.split(buffer.toString(), ",")); } else { if(node != null && isFirstTimeRender && node.hasProperty(propertyName)) { List<String> valueList = new ArrayList<String>(); if (node.getProperty(propertyName).getDefinition().isMultiple() && (!"true".equals(onchange) || !isOnchange)) { Value[] values = node.getProperty(propertyName).getValues(); for(Value value : values) { buffer.append(value.getString()).append(","); } } else if("true".equals(onchange) && isOnchange) { if (uiSelectBox.isMultiple()) { String[] values = uiSelectBox.getSelectedValues(); for (String value : values) { buffer.append(value).append(","); } } else { String values = uiSelectBox.getValue(); buffer.append(values).append(","); } } else { Value[] values = node.getProperty(propertyName).getValues(); for(Value value : values) { buffer.append(value.getString()).append(","); } } uiSelectBox.setSelectedValues(StringUtils.split(buffer.toString(), ",")); } } } else { if ((childNode != null) && isFirstTimeRender && childNode.hasProperty(propertyName)) { uiSelectBox.setValue(childNode.getProperty(propertyName).getValue().getString()); } else { if (node != null && node.hasProperty(propertyName)) { if (node.getProperty(propertyName).getDefinition().isMultiple()) { if (findComponentById(name) == null) uiSelectBox.setValue(node.getProperty(propertyName).getValues().toString()); } else if (formSelectBoxField.isOnchange() && isOnchange) { uiSelectBox.setValue(uiSelectBox.getValue()); } else { if (findComponentById(name) == null) uiSelectBox.setValue(node.getProperty(propertyName).getValue().getString()); } } } } uiSelectBox.setReadOnly(!formSelectBoxField.isEditable()); // addUIFormInput(uiSelectBox); if(isNotEditNode) { Node child = getChildNode(); if(child != null && child.hasProperty(propertyName)) { if(child.getProperty(propertyName).getDefinition().isMultiple()) { Value[] values = child.getProperty(propertyName).getValues(); List<String> listValues = new ArrayList<String>(); for(Value value : values) { listValues.add(value.getString()); } uiSelectBox.setSelectedValues(listValues.toArray(new String[listValues.size()])); } else { uiSelectBox.setValue(DialogFormUtil.getPropertyValueAsString(child,propertyName)); } } } if(formSelectBoxField.isOnchange()) uiSelectBox.setOnChange("Onchange"); if (findComponentById(name) == null) addUIFormInput(uiSelectBox); StringBuilder newValues = new StringBuilder(); int count = 0; for (String v : ((UIFormSelectBox)findComponentById(name)).getSelectedValues()) { if (count++ > 0) newValues.append(","); newValues.append(v); } String newValue = newValues.toString(); JcrInputProperty inputProperty = properties.get(name); if (inputProperty== null) { inputProperty = new JcrInputProperty(); inputProperty.setJcrPath(jcrPath); inputProperty.setChangeInJcrPathParam(formSelectBoxField.getChangeInJcrPathParam()); setInputProperty(name, inputProperty); } else { if (inputProperty.getValue() != null) { String oldValue = inputProperty.getValue().toString(); if ((oldValue != null) && (!oldValue.equals(newValue))) { Iterator<String> componentSelector = componentSelectors.keySet().iterator(); Map<String, String> obj = null; while (componentSelector.hasNext()) { String componentName = componentSelector.next(); obj = (Map<String, String>) componentSelectors.get(componentName); Set<String> set = obj.keySet(); for (String key : set) { if (name.equals(obj.get(key))) { UIComponent uiInput = findComponentById(componentName); ((UIFormStringInput) uiInput).reset(); } } } } } } inputProperty.setValue(newValue); if (isUpdateSelect && newValue != null) { String[] values1 = newValue.split(","); uiSelectBox.setSelectedValues(values1); } renderField(name); } public void addSelectBoxField(String name, String[] arguments) throws Exception { addSelectBoxField(name,null,arguments); } public void addTextAreaField(String name, String label, String[] arguments) throws Exception { UIFormTextAreaField formTextAreaField = new UIFormTextAreaField(name,label,arguments); if(formTextAreaField.useSelector()) { componentSelectors.put(name, formTextAreaField.getSelectorInfo()); } String jcrPath = formTextAreaField.getJcrPath(); JcrInputProperty inputProperty = new JcrInputProperty(); inputProperty.setJcrPath(jcrPath); inputProperty.setChangeInJcrPathParam(formTextAreaField.getChangeInJcrPathParam()); setInputProperty(name, inputProperty); String option = formTextAreaField.getOptions(); setInputOption(name, option); String propertyName = getPropertyName(jcrPath); propertiesName.put(name, propertyName); fieldNames.put(propertyName, name); Node node = getNode(); Node childNode = getChildNode(); boolean isFirstTimeRender = false; if(formTextAreaField.isMultiValues()) { UIFormMultiValueInputSet uiMulti; if(node == null && childNode == null) { uiMulti = findComponentById(name); if(uiMulti == null) { isFirstTimeRender = true; uiMulti = createUIComponent(UIFormMultiValueInputSet.class, null, null); uiMulti.setId(name); uiMulti.setName(name); uiMulti.setType(UIFormTextAreaInput.class); uiMulti.setEditable(formTextAreaField.isEditable()); if (formTextAreaField.validateType != null) { String validateType = formTextAreaField.validateType; String[] validatorList = null; if (validateType.indexOf(',') > -1) validatorList = validateType.split(","); else validatorList = new String[] {validateType}; for (String validator : validatorList) { Object[] params; String s_param=null; int p_begin, p_end; p_begin = validator.indexOf(DialogFormUtil.VALIDATOR_PARAM_BEGIN); p_end = validator.indexOf(DialogFormUtil.VALIDATOR_PARAM_END); if (p_begin>=0 && p_end > p_begin) { s_param = validator.substring(p_begin, p_end); params = s_param.split(DialogFormUtil.VALIDATOR_PARAM_SEPERATOR); uiMulti.addValidator(DialogFormUtil.getValidator(validator.trim()), params) ; }else { uiMulti.addValidator(DialogFormUtil.getValidator(validator.trim())) ; } } } List<String> valueList = new ArrayList<String>(); List<UIComponent> listChildren = uiMulti.getChildren(); if (listChildren.size() == 0) { valueList.add(formTextAreaField.getDefaultValue()); } else { for (UIComponent component : listChildren) { UIFormTextAreaInput uiTextAreaInput = (UIFormTextAreaInput)component; if(uiTextAreaInput.getValue() != null) { valueList.add(uiTextAreaInput.getValue().trim()); } else{ valueList.add(formTextAreaField.getDefaultValue()); } } } uiMulti.setValue(valueList); addUIFormInput(uiMulti); } } else { uiMulti = createUIComponent(UIFormMultiValueInputSet.class, null, null); isFirstTimeRender = true; uiMulti.setId(name); uiMulti.setName(name); uiMulti.setType(UIFormTextAreaInput.class); uiMulti.setEditable(formTextAreaField.isEditable()); if (formTextAreaField.validateType != null) { String validateType = formTextAreaField.validateType; String[] validatorList = null; if (validateType.indexOf(',') > -1) validatorList = validateType.split(","); else validatorList = new String[] { validateType }; for (String validator : validatorList) { Object[] params; String s_param = null; int p_begin, p_end; p_begin = validator.indexOf(DialogFormUtil.VALIDATOR_PARAM_BEGIN); p_end = validator.indexOf(DialogFormUtil.VALIDATOR_PARAM_END); if (p_begin >= 0 && p_end > p_begin) { s_param = validator.substring(p_begin, p_end); params = s_param.split(DialogFormUtil.VALIDATOR_PARAM_SEPERATOR); uiMulti.addValidator(DialogFormUtil.getValidator(validator.trim()), params); } else { uiMulti.addValidator(DialogFormUtil.getValidator(validator.trim())); } } } addUIFormInput(uiMulti); } List<String> valueList = new ArrayList<String>(); boolean valueListIsSet = false; if((node != null) && node.hasNode("jcr:content") && (childNode == null)) { Node jcrContentNode = node.getNode("jcr:content"); if(jcrContentNode.hasProperty(propertyName)) { Value[] values = jcrContentNode.getProperty(propertyName).getValues(); for(Value value : values) { valueList.add(value.getString()); } uiMulti.setEditable(formTextAreaField.isEditable()); uiMulti.setValue(valueList); valueListIsSet = true; } } else { if(childNode != null) { if(childNode.hasProperty(propertyName)) { Value[] values = childNode.getProperty(propertyName).getValues(); for(Value value : values) { valueList.add(value.getString()); } uiMulti.setEditable(formTextAreaField.isEditable()); uiMulti.setValue(valueList); valueListIsSet = true; } } } if (!valueListIsSet && node != null && !isShowingComponent && !isRemovePreference && isFirstTimeRender) { String propertyPath = jcrPath.substring("/node/".length()); if (node.hasProperty(propertyPath)) { Value[] values = node.getProperty(propertyPath).getValues(); // if the node type is mix:referenceable, its values will contain the UUIDs of the reference nodes // we need to get the paths of the reference nodes instead of its UUIDs to display onto screen if (node.getProperty(propertyPath).getType() == PropertyType.REFERENCE) { for (Value vl : values) { if (vl != null) { String strUUID = vl.getString(); try { String strReferenceableNodePath = node.getSession().getNodeByUUID(strUUID).getPath(); //if the referenceable node is not ROOT, remove the "/" character at head if (strReferenceableNodePath.length() > 1){ strReferenceableNodePath = strReferenceableNodePath.substring(1); } valueList.add(strReferenceableNodePath); } catch (ItemNotFoundException infEx) { valueList.add(formTextAreaField.getDefaultValue()); } catch (RepositoryException repoEx) { valueList.add(formTextAreaField.getDefaultValue()); } } } } else { for (Value vl : values) { if (vl != null) { valueList.add(vl.getString()); } } } } uiMulti.setValue(valueList); } if(isResetMultiField) { uiMulti.setValue(new ArrayList<Value>()); } uiMulti.setEditable(formTextAreaField.isEditable()); renderField(name); return; } UIFormTextAreaInput uiTextArea = findComponentById(name); if(uiTextArea == null) { isFirstTimeRender = true; uiTextArea = formTextAreaField.createUIFormInput(); if(formTextAreaField.getRowSize() != null){ uiTextArea.setRows(Integer.parseInt(formTextAreaField.getRowSize())); } else { uiTextArea.setRows(UIFormTextAreaField.DEFAULT_ROW); } if(formTextAreaField.getColSize() != null){ uiTextArea.setColumns(Integer.parseInt(formTextAreaField.getColSize())); } else { uiTextArea.setColumns(UIFormTextAreaField.DEFAULT_COL); } addUIFormInput(uiTextArea); } if (node != null && !isShowingComponent && !isRemovePreference && isFirstTimeRender) { StringBuffer value = new StringBuffer(); if (node.hasProperty(propertyName)) { value.append(node.getProperty(propertyName).getValue().getString()); uiTextArea.setValue(value.toString()); } else if (node.isNodeType("nt:file")) { Node jcrContentNode = node.getNode("jcr:content"); if (jcrContentNode.hasProperty(propertyName)) { if (jcrContentNode.getProperty(propertyName).getDefinition().isMultiple()) { Value[] values = jcrContentNode.getProperty(propertyName).getValues(); for (Value v : values) { value.append(v.getString()); } uiTextArea.setValue(value.toString()); } else { uiTextArea.setValue(jcrContentNode.getProperty(propertyName).getValue().getString()); } } } } if (isNotEditNode && !isShowingComponent && !isRemovePreference && isFirstTimeRender) { if (node != null && node.hasNode("jcr:content") && childNode != null) { Node jcrContentNode = node.getNode("jcr:content"); uiTextArea.setValue(jcrContentNode.getProperty("jcr:data").getValue().getString()); } else { if (childNode != null) { uiTextArea.setValue(propertyName); } else if (childNode == null && jcrPath.equals("/node") && node != null) { uiTextArea.setValue(node.getName()); } else { uiTextArea.setValue(null); } } } //set default value for textarea if no value was set by above code if (uiTextArea.getValue() == null) { if (formTextAreaField.getDefaultValue() != null) uiTextArea.setValue(formTextAreaField.getDefaultValue()); else uiTextArea.setValue(""); } uiTextArea.setReadOnly(!formTextAreaField.isEditable()); renderField(name); } public void addTextAreaField(String name, String[] arguments) throws Exception { addTextAreaField(name,null,arguments); } public String getPathTaxonomy() throws Exception { NodeHierarchyCreator nodeHierarchyCreator = getApplicationComponent(NodeHierarchyCreator.class); DMSConfiguration dmsConfiguration = getApplicationComponent(DMSConfiguration.class); String workspace = dmsConfiguration.getConfig().getSystemWorkspace(); String userName = Util.getPortalRequestContext().getRemoteUser(); Session session; if (userName != null) session = WCMCoreUtils.getUserSessionProvider().getSession(workspace, getRepository()); else session = WCMCoreUtils.createAnonimProvider().getSession(workspace, getRepository()); return ((Node)session.getItem(nodeHierarchyCreator.getJcrPath(BasePath.TAXONOMIES_TREE_STORAGE_PATH))).getPath(); } @SuppressWarnings("unchecked") public void addTextField(String name, String label, String[] arguments) throws Exception { UIFormTextField formTextField = new UIFormTextField(name,label,arguments); String jcrPath = formTextField.getJcrPath(); String mixintype = formTextField.getMixinTypes(); String nodetype = formTextField.getNodeType(); JcrInputProperty inputProperty = new JcrInputProperty(); inputProperty.setJcrPath(jcrPath); inputProperty.setChangeInJcrPathParam(formTextField.getChangeInJcrPathParam()); setInputProperty(name, inputProperty); String option = formTextField.getOptions(); setInputOption(name, option); String propertyName = getPropertyName(jcrPath); if(mixintype != null) inputProperty.setMixintype(mixintype); if(jcrPath.equals("/node") && nodetype != null ) inputProperty.setNodetype(nodetype); properties.put(name, inputProperty); propertiesName.put(name, propertyName); fieldNames.put(propertyName, name); Node node = getNode(); Node childNode = getChildNode(); if(!isReference) { if(formTextField.isReference()) isReference = true; else isReference = false; } boolean isFirstTimeRender = false; if(formTextField.isMultiValues()) { UIFormMultiValueInputSet uiMulti; if(node == null &&childNode == null) { uiMulti = findComponentById(name); if(uiMulti == null) { isFirstTimeRender = true; uiMulti = createUIComponent(UIFormMultiValueInputSet.class, null, null); uiMulti.setId(name); uiMulti.setName(name); uiMulti.setType(UIFormStringInput.class); uiMulti.setEditable(formTextField.isEditable()); if (formTextField.validateType != null) { String validateType = formTextField.validateType; String[] validatorList = null; if (validateType.indexOf(',') > -1) validatorList = validateType.split(","); else validatorList = new String[] {validateType}; for (String validator : validatorList) { Object[] params; String s_param=null; int p_begin, p_end; p_begin = validator.indexOf(DialogFormUtil.VALIDATOR_PARAM_BEGIN); p_end = validator.indexOf(DialogFormUtil.VALIDATOR_PARAM_END); if (p_begin>=0 && p_end > p_begin) { s_param = validator.substring(p_begin, p_end); params = s_param.split(DialogFormUtil.VALIDATOR_PARAM_SEPERATOR); uiMulti.addValidator(DialogFormUtil.getValidator(validator.trim()), params) ; }else { uiMulti.addValidator(DialogFormUtil.getValidator(validator.trim())) ; } } } List<String> valueList = new ArrayList<String>(); List<UIComponent> listChildren = uiMulti.getChildren(); if (listChildren.size() == 0) { valueList.add(formTextField.getDefaultValue()); } else { for (UIComponent component : listChildren) { UIFormStringInput uiStringInput = (UIFormStringInput)component; if(uiStringInput.getValue() != null) { valueList.add(uiStringInput.getValue().trim()); } else{ valueList.add(formTextField.getDefaultValue()); } } } uiMulti.setValue(valueList); addUIFormInput(uiMulti); } } else { uiMulti = createUIComponent(UIFormMultiValueInputSet.class, null, null); isFirstTimeRender = true; uiMulti.setId(name); uiMulti.setName(name); uiMulti.setType(UIFormStringInput.class); uiMulti.setEditable(formTextField.isEditable()); if (formTextField.validateType != null) { String validateType = formTextField.validateType; String[] validatorList = null; if (validateType.indexOf(',') > -1) validatorList = validateType.split(","); else validatorList = new String[] {validateType}; for (String validator : validatorList) { Object[] params; String s_param=null; int p_begin, p_end; p_begin = validator.indexOf(DialogFormUtil.VALIDATOR_PARAM_BEGIN); p_end = validator.indexOf(DialogFormUtil.VALIDATOR_PARAM_END); if (p_begin>=0 && p_end > p_begin) { s_param = validator.substring(p_begin, p_end); params = s_param.split(DialogFormUtil.VALIDATOR_PARAM_SEPERATOR); uiMulti.addValidator(DialogFormUtil.getValidator(validator.trim()), params) ; }else { uiMulti.addValidator(DialogFormUtil.getValidator(validator.trim())) ; } } } if (getChildById(name) == null) addUIFormInput(uiMulti); } List<String> valueList = new ArrayList<String>(); boolean valueListIsSet = false; if((node != null) && node.hasNode("jcr:content") && (childNode == null)) { Node jcrContentNode = node.getNode("jcr:content"); if(jcrContentNode.hasProperty(propertyName)) { Value[] values = jcrContentNode.getProperty(propertyName).getValues(); for(Value value : values) { valueList.add(value.getString()); } uiMulti.setEditable(formTextField.isEditable()); uiMulti.setValue(valueList); valueListIsSet = true; } } else { if(childNode != null) { if(childNode.hasProperty(propertyName)) { Value[] values = childNode.getProperty(propertyName).getValues(); for(Value value : values) { valueList.add(value.getString()); } uiMulti.setEditable(formTextField.isEditable()); uiMulti.setValue(valueList); valueListIsSet = true; } } } if (!valueListIsSet && node != null && !isShowingComponent && !isRemovePreference && isFirstTimeRender) { String propertyPath = jcrPath.substring("/node/".length()); if (node.hasProperty(propertyPath)) { Value[] values = node.getProperty(propertyPath).getValues(); // if the node type is mix:referenceable, its values will contain the UUIDs of the reference nodes // we need to get the paths of the reference nodes instead of its UUIDs to display onto screen if (node.getProperty(propertyPath).getType() == PropertyType.REFERENCE) { for (Value vl : values) { if (vl != null) { String strUUID = vl.getString(); try { String strReferenceableNodePath = node.getSession().getNodeByUUID(strUUID).getPath(); //if the referenceable node is not ROOT, remove the "/" character at head if (strReferenceableNodePath.length() > 1){ strReferenceableNodePath = strReferenceableNodePath.substring(1); } valueList.add(strReferenceableNodePath); } catch (ItemNotFoundException infEx) { valueList.add(formTextField.getDefaultValue()); } catch (RepositoryException repoEx) { valueList.add(formTextField.getDefaultValue()); } } } } else { for (Value vl : values) { if (vl != null) { valueList.add(vl.getString()); } } } } uiMulti.setValue(valueList); } if(isResetMultiField) { uiMulti.setValue(new ArrayList<Value>()); } uiMulti.setEditable(formTextField.isEditable()); renderField(name); return; } UIFormStringInput uiInput = findComponentById(name); if(uiInput == null) { isFirstTimeRender = true; uiInput = formTextField.createUIFormInput(); addUIFormInput(uiInput); } uiInput.setReadOnly(!formTextField.isEditable()); if(uiInput.getValue() == null) uiInput.setValue(formTextField.getDefaultValue()); else uiInput.setReadOnly(false); if(node != null && !isShowingComponent && !isRemovePreference) { if(jcrPath.equals("/node") && (!formTextField.isEditable() || formTextField.isEditableIfNull())) { uiInput.setDisabled(true); } } if(node != null && !isShowingComponent && !isRemovePreference && isFirstTimeRender) { if(jcrPath.equals("/node") && (!formTextField.isEditable() || formTextField.isEditableIfNull())) { String value = uiInput.getValue(); if(i18nNodePath != null) { uiInput.setValue(i18nNodePath.substring(i18nNodePath.lastIndexOf("/") + 1)); } else { String nameValue = node.getPath().substring(node.getPath().lastIndexOf("/") + 1); uiInput.setValue(nameValue); } } else if(node.hasProperty(propertyName)) { uiInput.setValue(node.getProperty(propertyName).getValue().getString()); } } if(isNotEditNode && !isShowingComponent && !isRemovePreference) { if(childNode != null && childNode.hasProperty(propertyName)) { if(childNode.hasProperty(propertyName)) { uiInput.setValue(childNode.getProperty(propertyName).getValue().getString()); } } else if(childNode == null && jcrPath.equals("/node") && node != null) { uiInput.setValue(node.getName()); } else if(i18nNodePath != null && jcrPath.equals("/node")) { uiInput.setValue(i18nNodePath.substring(i18nNodePath.lastIndexOf("/") + 1)); } else { uiInput.setValue(formTextField.getDefaultValue()); } } renderField(name); } public void addTextField(String name, String[] arguments) throws Exception { addTextField(name,null,arguments); } public void addUploadField(String name,String label,String[] arguments) throws Exception { UIFormUploadField formUploadField = new UIFormUploadField(name,label,arguments); String mimeTypes = formUploadField.getMimeTypes(); String jcrPath = formUploadField.getJcrPath(); JcrInputProperty inputProperty = new JcrInputProperty(); inputProperty.setJcrPath(jcrPath); inputProperty.setChangeInJcrPathParam(formUploadField.getChangeInJcrPathParam()); setInputProperty(name, inputProperty); String option = formUploadField.getOptions(); setInputOption(name, option); setMultiPart(true); String propertyName = getPropertyName(jcrPath); properties.put(name, inputProperty); propertiesName.put(name, propertyName); fieldNames.put(propertyName, name); Node node = getNode(); if(formUploadField.isMultiValues()) { UIFormMultiValueInputSet multiValueField = getChildById(name); if (multiValueField == null) { String propertyPath = jcrPath.substring("/node/".length()); if (node != null && node.hasNode(propertyPath)) { multiValueField = createUIComponent(UIFormUploadMultiValueInputSet.class, null, null); multiValueField.setId(name); multiValueField.setName(name); multiValueField.setType(UIFormUploadInputNoUploadButton.class); addUIFormInput(multiValueField); NodeIterator nodeIter = node.getNode(propertyPath).getNodes(); int count = 0; while (nodeIter.hasNext()) { Node childNode = nodeIter.nextNode(); if (!childNode.isNodeType(NodetypeConstant.NT_FILE)) continue; UIFormInputBase<?> uiInput = multiValueField.createUIFormInput(count++); ((UIFormUploadInputNoUploadButton)uiInput).setFileName(childNode.getName()); Value value = childNode.getNode(NodetypeConstant.JCR_CONTENT).getProperty(NodetypeConstant.JCR_DATA).getValue(); ((UIFormUploadInputNoUploadButton)uiInput).setByteValue( IOUtil.getStreamContentAsBytes(value.getStream())); } if(label != null) multiValueField.setLabel(label); multiValueField.setType(UIFormUploadInputNoRemoveButton.class); renderField(name); return; } multiValueField = renderMultiValuesInput(UIFormUploadInputNoRemoveButton.class,name,label); if (mimeTypes != null) { multiValueField.addValidator(UploadFileMimeTypesValidator.class, mimeTypes); } return; } } else { UIUploadInput uiInputUpload = findComponentById(name); if(uiInputUpload == null) { uiInputUpload = formUploadField.createUIFormInput(); if (mimeTypes != null) { uiInputUpload.addValidator(UploadFileMimeTypesValidator.class, mimeTypes); } addUIFormInput(uiInputUpload); } } renderField(name); } public void addUploadField(String name, String[] arguments) throws Exception { addUploadField(name,null,arguments); } public void addWYSIWYGField(String name, String label, String[] arguments) throws Exception { UIFormWYSIWYGField formWYSIWYGField = new UIFormWYSIWYGField(name,label,arguments); String jcrPath = formWYSIWYGField.getJcrPath(); JcrInputProperty inputProperty = new JcrInputProperty(); inputProperty.setJcrPath(jcrPath); inputProperty.setChangeInJcrPathParam(formWYSIWYGField.getChangeInJcrPathParam()); setInputProperty(name, inputProperty); String option = formWYSIWYGField.getOptions(); setInputOption(name, option); String propertyName = getPropertyName(jcrPath); propertiesName.put(name, propertyName); fieldNames.put(propertyName, name); List<UIFormInputBase<String>> wysiwygList = getUIFormInputList(name, formWYSIWYGField, false); if(formWYSIWYGField.isMultiValues()) { UIFormMultiValueInputSet uiMulti = findComponentById(name); if (uiMulti == null) { uiMulti = createUIComponent(UIFormMultiValueInputSet.class, WYSIWYG_MULTI_ID, null); this.uiMultiValueParam.put(name, arguments); uiMulti.setId(name); uiMulti.setName(name); uiMulti.setType(UIFormWYSIWYGInput.class); for (int i = 0; i < wysiwygList.size(); i++) { uiMulti.addChild(wysiwygList.get(i)); wysiwygList.get(i).setId(name + i); wysiwygList.get(i).setName(name + i); } addUIFormInput(uiMulti); if(label != null) uiMulti.setLabel(label); } } else { if (wysiwygList.size() > 0) addUIFormInput(wysiwygList.get(0)); } renderField(name); } @SuppressWarnings("unchecked") private List<UIFormInputBase<String>> getUIFormInputList(String name, DialogFormField formField, boolean isCreateNew) throws Exception { String jcrPath = formField.getJcrPath(); String propertyName = getPropertyName(jcrPath); List<UIFormInputBase<String>> ret = new ArrayList<UIFormInputBase<String>>(); UIFormInputBase<String> formInput = formField.isMultiValues() ? null : (UIFormInputBase<String>)findComponentById(name); boolean isFirstTimeRender = false; if(formInput == null) { isFirstTimeRender = true; formInput = formField.createUIFormInput(); } /** * Broadcast some info about current node by FCKEditorConfig Object * FCKConfigService used to allow add custom config for fckeditor from service * */ FCKEditorConfig config = new FCKEditorConfig(); FCKEditorContext editorContext = new FCKEditorContext(); if(repositoryName != null) { config.put("repositoryName",repositoryName); editorContext.setRepository(repositoryName); } if(workspaceName != null) { config.put("workspaceName",workspaceName); editorContext.setWorkspace(workspaceName); } if(nodePath != null) { config.put("jcrPath",nodePath); editorContext.setCurrentNodePath(nodePath); }else { config.put("jcrPath",storedPath); editorContext.setCurrentNodePath(storedPath); } FCKConfigService fckConfigService = getApplicationComponent(FCKConfigService.class); editorContext.setPortalName(Util.getUIPortal().getName()); editorContext.setSkinName(Util.getUIPortalApplication().getSkin()); fckConfigService.processFCKEditorConfig(config,editorContext); if (formInput instanceof UIFormWYSIWYGInput) ((UIFormWYSIWYGInput)formInput).setFCKConfig(config); if(formInput.getValue() == null) formInput.setValue(formField.getDefaultValue()); Node node = getNode(); if (isCreateNew) { ret.add(formInput); return ret; } if (!formField.isMultiValues() && isFirstTimeRender) { if(!isShowingComponent && !isRemovePreference) { if(node != null && (node.isNodeType("nt:file") || isNTFile) && formField.isFillJcrDataFile()) { Node jcrContentNode = node.getNode("jcr:content"); formInput.setValue(jcrContentNode.getProperty("jcr:data").getValue().getString()); } else { if(node != null && node.hasProperty(propertyName)) { formInput.setValue(node.getProperty(propertyName).getValue().getString()); } } } if(isNotEditNode && !isShowingComponent && !isRemovePreference && isFirstTimeRender) { Node childNode = getChildNode(); if(node != null && node.hasNode("jcr:content") && childNode != null && formField.isFillJcrDataFile()) { Node jcrContentNode = node.getNode("jcr:content"); formInput.setValue(jcrContentNode.getProperty("jcr:data").getValue().getString()); } else { if(childNode != null) { formInput.setValue(propertyName); } else if(childNode == null && jcrPath.equals("/node") && node != null) { formInput.setValue(node.getName()); } else { formInput.setValue(null); } } } ret.add(formInput); return ret; } Value[] values = null; if(!isShowingComponent && !isRemovePreference && isFirstTimeRender) { if(node != null && node.hasProperty(propertyName)) { values = node.getProperty(propertyName).getValues(); } } if(isNotEditNode && !isShowingComponent && !isRemovePreference && isFirstTimeRender) { Node childNode = getChildNode(); if(childNode != null) { values = new Value[] {node.getSession().getValueFactory().createValue(propertyName)}; } else if(childNode == null && jcrPath.equals("/node") && node != null) { values = new Value[] {node.getSession().getValueFactory().createValue(node.getName())}; } else { values = new Value[] {node.getSession().getValueFactory().createValue("")}; } } if (values != null && isFirstTimeRender) { for (Value v : values) { UIFormInputBase<String> uiFormInput = formField.createUIFormInput(); if (uiFormInput instanceof UIFormWYSIWYGInput) ((UIFormWYSIWYGInput)uiFormInput).setFCKConfig((FCKEditorConfig)config.clone()); if(v == null || v.getString() == null) uiFormInput.setValue(formField.getDefaultValue()); else uiFormInput.setValue(v.getString()); ret.add(uiFormInput); } } else { ret.add(formInput); } return ret; } public void addWYSIWYGField(String name, String[] arguments) throws Exception { addWYSIWYGField(name,null,arguments); } public void addRichtextField(String name, String label, String[] arguments) throws Exception { UIFormRichtextField richtextField = new UIFormRichtextField(name,label,arguments); String jcrPath = richtextField.getJcrPath(); JcrInputProperty inputProperty = new JcrInputProperty(); inputProperty.setJcrPath(jcrPath); inputProperty.setChangeInJcrPathParam(richtextField.getChangeInJcrPathParam()); setInputProperty(name, inputProperty); String option = richtextField.getOptions(); setInputOption(name, option); String propertyName = getPropertyName(jcrPath); propertiesName.put(name, propertyName); fieldNames.put(propertyName, name); List<UIFormInputBase<String>> richtextList = getUIFormInputList(name, richtextField, false); if(richtextField.isMultiValues()) { UIFormMultiValueInputSet uiMulti = findComponentById(name); if (uiMulti == null) { uiMulti = createUIComponent(UIFormMultiValueInputSet.class, WYSIWYG_MULTI_ID, null); this.uiMultiValueParam.put(name, arguments); uiMulti.setId(name); uiMulti.setName(name); uiMulti.setType(UIFormRichtextInput.class); for (int i = 0; i < richtextList.size(); i++) { uiMulti.addChild(richtextList.get(i)); richtextList.get(i).setId(name + i); richtextList.get(i).setName(name + i); } addUIFormInput(uiMulti); if(label != null) uiMulti.setLabel(label); } } else { if (getChildById(name) == null && richtextList.size() > 0) addUIFormInput(richtextList.get(0)); } renderField(name); } public void addRichtextField(String name, String[] arguments) throws Exception { addRichtextField(name,null,arguments); } public Node getChildNode() throws Exception { if(childPath == null) return null; return (Node) getSession().getItem(childPath); } public String getContentType() { return contentType; }; public Map<String, JcrInputProperty> getInputProperties() { return properties; } public Map<String, String> getInputOptions() { return options; } public JcrInputProperty getInputProperty(String name) { return properties.get(name); } public String getInputOption(String name) { return options.get(name); } public JCRResourceResolver getJCRResourceResolver() { return resourceResolver; } public Node getNode() { if(nodePath == null) return null; try { return (Node) getSession().getItem(nodePath); } catch (Exception e) { return null; } } public String getPropertyName(String jcrPath) { return jcrPath.substring(jcrPath.lastIndexOf("/") + 1); } public String getSelectBoxFieldValue(String name) { UIFormSelectBox uiSelectBox = findComponentById(name); if (uiSelectBox != null) return uiSelectBox.getValue(); return null; } public List<String> getSelectedBoxFieldValue(String name) { UIFormSelectBox uiSelectBox = findComponentById(name); if (uiSelectBox != null) return Arrays.asList(uiSelectBox.getSelectedValues()); return null; } public Session getSession() throws Exception { return WCMCoreUtils.getUserSessionProvider().getSession(workspaceName, getRepository()); } public String getTemplate() { TemplateService templateService = getApplicationComponent(TemplateService.class); String userName = Util.getPortalRequestContext().getRemoteUser(); try { return templateService.getTemplatePathByUser(true, contentType, userName); } catch (Exception e) { UIApplication uiApp = getAncestorOfType(UIApplication.class); Object[] arg = { contentType }; uiApp.addMessage(new ApplicationMessage("UIDialogForm.msg.not-support-contenttype", arg, ApplicationMessage.ERROR)); return null; } } public boolean isResetForm() { return isResetForm; } public void onchange(Event<?> event) throws Exception { } @Override public void processAction(WebuiRequestContext context) throws Exception { String action = context.getRequestParameter(UIForm.ACTION); boolean clearInterceptor = false; if (SAVE_ACTION.equalsIgnoreCase(action) || SAVE_AND_CLOSE.equalsIgnoreCase(action)) { try { if (executePreSaveEventInterceptor()) { super.processAction(context); String nodePath_ = (String) context.getAttribute("nodePath"); if (nodePath_ != null) { executePostSaveEventInterceptor(nodePath_); clearInterceptor = true; } } else { context.setProcessRender(true); super.processAction(context); } } finally { if (clearInterceptor) { prevScriptInterceptor.clear(); postScriptInterceptor.clear(); } } } else { super.processAction(context); } } public void removeComponent(String name) { if (!properties.isEmpty() && properties.containsKey(name)) { properties.remove(name); String jcrPath = propertiesName.get(name); propertiesName.remove(name); fieldNames.remove(jcrPath); removeChildById(name); } } private String getResourceBundle(WebuiRequestContext context, String key) { try { ResourceBundle rs = context.getApplicationResourceBundle(); return rs.getString(key); } catch(MissingResourceException e) { if (LOG.isWarnEnabled()) { LOG.warn("Missing resource " + key); } key = key.contains(".") ? key.substring(key.lastIndexOf(".") + 1) : key; return key; } } public void renderField(String name) throws Exception { UIComponent uiInput = findComponentById(name); WebuiRequestContext context = WebuiRequestContext.getCurrentInstance(); Writer w = context.getWriter(); if(componentSelectors.get(name) != null && name.equals(componentSelectors.get(name).get("returnField"))) { uiInput.processRender(context); } else { uiInput.processRender(context); } if(componentSelectors.get(name) != null) { Map<String,String> fieldPropertiesMap = componentSelectors.get(name); String fieldName = fieldPropertiesMap.get("returnField"); String iconClass = "uiIconPlus"; if(fieldPropertiesMap.get("selectorIcon") != null) { iconClass = fieldPropertiesMap.get("selectorIcon"); } ResourceBundle rs = context.getApplicationResourceBundle(); String showComponent = getResourceBundle(context, getId().concat(".title.ShowComponent")); String removeReference = getResourceBundle(context, getId().concat(".title.removeReference")); if (name.equals(fieldName)) { w.write("<a rel=\"tooltip\" data-placement=\"bottom\" class=\"actionIcon\" title=\"" + showComponent + "\"" + "onclick=\"javascript:eXo.webui.UIForm.submitEvent('" + "" + getId() + "','ShowComponent','&objectId=" + fieldName + "' )\"><i" + " class='" + iconClass + " uiIconLightGray'></i></a>"); /* No need Remove action if uiInput is UIFormMultiValueInputSet */ if (!UIFormMultiValueInputSet.class.isInstance(uiInput)) w.write("<a rel=\"tooltip\" data-placement=\"bottom\" class=\"actionIcon\" title=\"" + removeReference + "\"" + "onclick=\"javascript:eXo.webui.UIForm.submitEvent('" + "" + getId() + "','RemoveReference','&objectId=" + fieldName + "' )\"><i" +" class='uiIconTrash uiIconLightGray'></i>" + "</a>"); } } } public String getImage(Node node, String nodeTypeName) throws Exception { DownloadService dservice = getApplicationComponent(DownloadService.class); Node imageNode = node.getNode(nodeTypeName); InputStream input = imageNode.getProperty(Utils.JCR_DATA).getStream(); InputStreamDownloadResource dresource = new InputStreamDownloadResource(input, "image"); dresource.setDownloadName(node.getName()); return dservice.getDownloadLink(dservice.addDownloadResource(dresource)); } public String getImage(InputStream input, String nodeName) throws Exception { DownloadService dservice = getApplicationComponent(DownloadService.class); InputStreamDownloadResource dresource = new InputStreamDownloadResource(input, "image"); dresource.setDownloadName(nodeName); return dservice.getDownloadLink(dservice.addDownloadResource(dresource)); } @Deprecated /** * Deprecated method, should used removeData(String path) next time */ public boolean dataRemoved() { return dataRemoved_; } @Deprecated public void setDataRemoved(boolean dataRemoved) { dataRemoved_ = dataRemoved; } /** * Mark a uploaded field as removed. * * @param path: of property content binarydata for uploading */ public void removeData(String path) { if (!removedBinary.contains(path)) { removedBinary.add(path); } } /** * Checking the binary field is removed or not * * @param path: of property content binarydata for uploading * @return : True if the uploaded field is removed from UI */ public boolean isDataRemoved(String path) { return removedBinary.contains(path); } public void clearDataRemovedList() { removedBinary.clear(); } public void resetProperties() { properties.clear(); } public void resetInterceptors(){ this.prevScriptInterceptor.clear(); this.postScriptInterceptor.clear(); } public void setChildPath(String childPath) { this.childPath = childPath; } public void setContentType(String type) { this.contentType = type; } public void setInputProperty(String name, JcrInputProperty value) { properties.put(name, value); } public void setInputOption(String name, String value) { options.put(name, value); } public void setIsNotEditNode(boolean isNotEditNode) { this.isNotEditNode = isNotEditNode; } public void setIsNTFile(boolean isNTFile) { this.isNTFile = isNTFile; } public void setIsOnchange(boolean isOnchange) { this.isOnchange = isOnchange; } public void setIsResetForm(boolean isResetForm) { this.isResetForm = isResetForm; } public void setIsResetMultiField(boolean isResetMultiField) { this.isResetMultiField = isResetMultiField; } public void setIsUpdateSelect(boolean isUpdateSelect) { this.isUpdateSelect = isUpdateSelect; } public void setJCRResourceResolver(JCRResourceResolver resourceResolver) { this.resourceResolver = resourceResolver; } public void setNodePath(String nodePath) { this.nodePath = nodePath; } public String getNodePath() { return nodePath; } public void setRepositoryName(String repositoryName){ this.repositoryName = repositoryName; } public void setStoredPath(String storedPath) { this.storedPath = storedPath; } public String getStoredPath() { return storedPath; } public void setWorkspace(String workspace) { this.workspaceName = workspace; } public String getLastModifiedDate() throws Exception { return getLastModifiedDate(getNode()); } public String getLastModifiedDate(Node node) { String d = StringUtils.EMPTY; try { if (node.hasProperty("exo:dateModified")) { Locale locale = Util.getPortalRequestContext().getLocale(); DateFormat dateFormater = SimpleDateFormat.getDateTimeInstance(SimpleDateFormat.MEDIUM, SimpleDateFormat.MEDIUM, locale); Calendar calendar = node.getProperty("exo:dateModified").getValue().getDate(); d = dateFormater.format(calendar.getTime()); } } catch (ValueFormatException e) { d = StringUtils.EMPTY; } catch (IllegalStateException e) { d = StringUtils.EMPTY; } catch (PathNotFoundException e) { d = StringUtils.EMPTY; } catch (RepositoryException e) { d = StringUtils.EMPTY; } return d; } protected List<String> getRemovedNodes() { return removedNodes; } public void addRemovedNode(String path) { removedNodes.add(path); } public void clearRemovedNode() { removedNodes = new ArrayList<String>(); } private void executePostSaveEventInterceptor(String nodePath_) throws Exception { if (postScriptInterceptor.size() > 0) { String path = nodePath_ + "&workspaceName=" + this.workspaceName + "&repository=" + this.repositoryName; for (String interceptor : postScriptInterceptor) { this.executeScript(interceptor, path, null, true); } } } private boolean executePreSaveEventInterceptor() throws Exception { if (!prevScriptInterceptor.isEmpty()) { Map<String, JcrInputProperty> maps = DialogFormUtil.prepareMap(this.getChildren(), getInputProperties(), getInputOptions()); for (String interceptor : prevScriptInterceptor) { if(!executeScript(interceptor, maps, null, false)){ return false; } } } return true; } private boolean executeScript(String script, Object o, String[] params, boolean printException) throws Exception { ScriptService scriptService = getApplicationComponent(ScriptService.class); try { CmsScript dialogScript = scriptService.getScript(script); if (params != null) { dialogScript.setParams(params); } dialogScript.execute(o); return true; } catch (Exception e) { if(printException){ if (LOG.isWarnEnabled()) { LOG.warn("An unexpected error occurs", e); } } else { UIApplication uiApp = getAncestorOfType(UIApplication.class); if (e instanceof DialogFormException) { for (ApplicationMessage message : ((DialogFormException) e).getMessages()) { uiApp.addMessage(message); } } else { JCRExceptionManager.process(uiApp, e); } } } return false; } private String getNodePathByUUID(String uuid) throws Exception{ String[] workspaces = getRepository().getWorkspaceNames(); Node node = null; for(String ws : workspaces) { try{ node = WCMCoreUtils.getSystemSessionProvider().getSession(ws, getRepository()).getNodeByUUID(uuid); return ws + ":" + node.getPath(); } catch(ItemNotFoundException e) { continue; } } if (LOG.isErrorEnabled()) { LOG.error("No node with uuid ='" + uuid + "' can be found"); } return null; } private ManageableRepository getRepository() throws Exception{ RepositoryService repositoryService = getApplicationComponent(RepositoryService.class); return repositoryService.getCurrentRepository(); } private UIFormMultiValueInputSet renderMultiValuesInput(Class<? extends UIFormInputBase<?>> type, String name,String label) throws Exception{ UIFormMultiValueInputSet ret = addMultiValuesInput(type, name, label); renderField(name); return ret; } private UIFormMultiValueInputSet addMultiValuesInput(Class<? extends UIFormInputBase<?>> type, String name,String label) throws Exception{ UIFormMultiValueInputSet uiMulti = null; if (UIUploadInput.class.isAssignableFrom(type)) { uiMulti = createUIComponent(UIFormUploadMultiValueInputSet.class, null, null); } else { uiMulti = createUIComponent(UIFormMultiValueInputSet.class, null, null); } uiMulti.setId(name); uiMulti.setName(name); uiMulti.setType(type); addUIFormInput(uiMulti); if(label != null) uiMulti.setLabel(label); return uiMulti; } static public class OnchangeActionListener extends EventListener<UIDialogForm> { public void execute(Event<UIDialogForm> event) throws Exception { event.getSource().isOnchange = true; event.getSource().onchange(event); } } public boolean isOnchange() { return isOnchange; } public void processRenderAction() throws Exception { WebuiRequestContext context = WebuiRequestContext.getCurrentInstance(); Writer writer = context.getWriter(); writer.append("<div class=\"uiAction uiActionBorder\">"); String[] listAction = getActions(); ResourceBundle res = context.getApplicationResourceBundle(); String actionLabel; String link; for (String action : listAction) { try { actionLabel = res.getString(getName() + ".action." + action); } catch (MissingResourceException e) { actionLabel = action; } link = event(action); writer.append("<button type=\"button\" class=\"btn\" onclick =\"") .append(link) .append("\">") .append(actionLabel) .append("</button>"); } writer.append("</div>"); } public Node getNodeByType(String nodeType) throws Exception { if (this.getNode() == null) return null; NodeIterator nodeIter = this.getNode().getNodes(); while (nodeIter.hasNext()) { Node node = nodeIter.nextNode(); if (node.isNodeType(nodeType)) return node; } return null; } static public class AddActionListener extends EventListener<UIFormMultiValueInputSet> { public void execute(Event<UIFormMultiValueInputSet> event) throws Exception { UIFormMultiValueInputSet uiSet = event.getSource(); String id = event.getRequestContext().getRequestParameter(OBJECTID); if (uiSet.getId().equals(id)) { // get max id List<UIComponent> children = uiSet.getChildren(); if (children.size() > 0) { UIFormInputBase<?> uiInput = (UIFormInputBase<?>) children.get(children.size() - 1); String index = uiInput.getId(); int maxIndex = Integer.parseInt(index.replaceAll(id, "")); UIDialogForm uiDialogForm = uiSet.getAncestorOfType(UIDialogForm.class); String[] arguments = uiDialogForm.uiMultiValueParam.get(uiSet.getName()); UIFormInputBase<?> newUIInput = null; if (uiInput instanceof UIFormWYSIWYGInput) { newUIInput = uiDialogForm.getUIFormInputList(uiSet.getName(), new UIFormWYSIWYGField(uiSet.getName(), null, arguments), true).get(0); } else { newUIInput = uiDialogForm.getUIFormInputList(uiSet.getName(), new UIFormRichtextField(uiSet.getName(), null, arguments), true).get(0); } uiSet.addChild(newUIInput); newUIInput.setId(uiSet.getName() + (maxIndex + 1)); newUIInput.setName(uiSet.getName() + (maxIndex + 1)); } } } } }