/* * Copyright (C) 2003-2007 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.component.admin.nodetype; import java.util.ArrayList; import java.util.List; import java.util.ResourceBundle; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.Session; import javax.jcr.nodetype.NodeDefinition; import javax.jcr.nodetype.NodeType; import javax.jcr.nodetype.NodeTypeManager; import javax.jcr.nodetype.PropertyDefinition; import org.exoplatform.ecm.webui.form.UIFormInputSetWithAction; import org.exoplatform.ecm.webui.form.validator.ECMNameValidator; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.core.ManageableRepository; import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager; import org.exoplatform.services.jcr.core.nodetype.NodeDefinitionValue; import org.exoplatform.services.jcr.core.nodetype.NodeTypeValue; import org.exoplatform.services.jcr.core.nodetype.PropertyDefinitionValue; import org.exoplatform.web.application.ApplicationMessage; 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.UIPopupWindow; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; 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.UIFormInputInfo; import org.exoplatform.webui.form.UIFormSelectBox; import org.exoplatform.webui.form.UIFormStringInput; import org.exoplatform.webui.form.UIFormTabPane; import org.exoplatform.webui.form.validator.MandatoryValidator; import org.exoplatform.webui.form.validator.Validator; /** * Created by The eXo Platform SARL * Author : Dang Van Minh * minh.dang@exoplatform.com * Sep 20, 2006 * 5:33:13 PM */ @ComponentConfigs ({ @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "app:/groovy/webui/component/admin/nodetype/UINodeTypeForm.gtmpl", events = { @EventConfig(listeners = UINodeTypeForm.CancelActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UINodeTypeForm.CloseActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UINodeTypeOptionList.CancelTabActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UINodeTypeForm.SaveDraftActionListener.class), @EventConfig(listeners = UINodeTypeForm.SaveActionListener.class), @EventConfig(listeners = UINodeTypeForm.SelectTabActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UINodeTypeForm.IsMixinActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIPropertyDefinitionForm.AddPropertyActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIChildNodeDefinitionForm.AddChildActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UINodeTypeForm.ViewChildNodeActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UINodeTypeForm.ViewPropertyActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UINodeTypeForm.AddSuperTypeActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIChildNodeDefinitionForm.AddDefaultTypeActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIChildNodeDefinitionForm.AddRequiredTypeActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UINodeTypeOptionList.AddTypeActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIChildNodeDefinitionForm.RemoveChildNodeActionListener.class, confirm = "UINodeTypeForm.msg.confirm-delete-child", phase = Phase.DECODE), @EventConfig(listeners = UIChildNodeDefinitionForm.EditChildNodeActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIPropertyDefinitionForm.EditPropertyActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIPropertyDefinitionForm.RemovePropertyActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIChildNodeDefinitionForm.UpdateChildActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIChildNodeDefinitionForm.CancelChildActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIPropertyDefinitionForm.UpdatePropertyActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIPropertyDefinitionForm.CancelPropertyActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIPropertyDefinitionForm.ChangeRequiredTypeActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIPropertyDefinitionForm.AddConstraintsActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIPropertyDefinitionForm.AddValueActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIPropertyDefinitionForm.CancelConstraintsActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIPropertyDefinitionForm.AddActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIPropertyDefinitionForm.RemoveActionListener.class, phase = Phase.DECODE, confirm = "UINodeTypeForm.msg.confirm-delete-property") } ) }) public class UINodeTypeForm extends UIFormTabPane { final static public String NAMESPACE = "namespace" ; final static public String NODETYPE_NAME = "nodeTypeName" ; final static public String MIXIN_TYPE = "mixinType" ; final static public String HAS_ORDERABLE_CHILDNODES = "hasOrderableChildNodes" ; final static public String PRIMARY_ITEMNAME = "primaryItemName" ; final static public String PROPERTY_DEFINITIONS = "propertiesDefinitions" ; final static public String CHILDNODE_DEFINITIONS = "childDefinitions" ; final static public String SUPER_TYPE = "superTypes" ; final static public String SUPER_TYPE_TAB = "superTypeTab" ; final static public String DEFAULT_PRIMARY_TYPE_TAB = "DefaultTypeTab" ; final static public String REQUIRED_PRIMARY_TYPE_TAB = "RequiredTypeTab" ; final static public String NODETYPE_DEFINITION = "nodeTypeDefinition" ; final static public String PROPERTY_DEFINITION = "propertyDefinition" ; final static public String CHILDNODE_DEFINITION = "childNodeDefinition" ; final static public String NT_UNSTRUCTURED = "nt:unstructured" ; final static public String PROPERTY_DEFINITIONS_NODE = "propertyDefinitions" ; final static public String CHILD_NODE_DEFINITIONS = "childNodeDefinitions" ; final static public String IS_MIX_IN = "isMixin" ; final static public String PROPERTY_NAME = "name" ; final static public String ON_PARENT_VERSION = "onParentVersion" ; final static public String JCR_NODETYPE_DRAFT = "jcr:nodetypesDraft" ; final static public String TRUE = "true" ; final static public String FALSE = "false" ; final static public String ADD_CHILD = "AddChild" ; final static public String ADD_PROPERTY = "AddProperty" ; final static public String ACTION_SAVE = "Save" ; final static public String ACTION_SAVEDRAFT = "SaveDraft" ; final static public String ACTION_CANCEL = "Cancel" ; final static public String ACTION_CANCEL_TAB = "CancelTab" ; final static public String[] ACTION_BACK = {"Back"} ; final static public String ADD_TYPE = "AddType" ; private boolean isDraft_ = false ; public List<PropertyDefinitionValue> addedPropertiesDef_ = new ArrayList<PropertyDefinitionValue>(); public List<NodeDefinitionValue> addedChildDef_ = new ArrayList<NodeDefinitionValue>(); private List<SelectItemOption<String>> namespacesOptions_ = new ArrayList<SelectItemOption<String>>(); private List<SelectItemOption<String>> mixinTypeOptions_ = new ArrayList<SelectItemOption<String>>(); private List<SelectItemOption<String>> orderAbleOptions_ = new ArrayList<SelectItemOption<String>>(); private PropertyDefinition[] propertyDefinitions_ ; private NodeDefinition[] childNodeDefinitions_ ; private NodeType nodeType_ ; public UINodeTypeForm() throws Exception { super("UINodeTypeForm"); UIFormSelectBox mixinSelectBox = new UIFormSelectBox(MIXIN_TYPE, MIXIN_TYPE, null); mixinSelectBox.setOnChange("IsMixin"); UIFormInputSetWithAction nodeTypeTab = new UIFormInputSetWithAction(NODETYPE_DEFINITION); nodeTypeTab.addUIFormInput(new UIFormSelectBox(NAMESPACE, NAMESPACE, null)) .addUIFormInput(new UIFormStringInput(NODETYPE_NAME, NODETYPE_NAME, null).addValidator(MandatoryValidator.class) .addValidator(ECMNameValidator.class)) .addUIFormInput(mixinSelectBox) .addUIFormInput(new UIFormSelectBox(HAS_ORDERABLE_CHILDNODES, HAS_ORDERABLE_CHILDNODES, null)) .addUIFormInput(new UIFormStringInput(PRIMARY_ITEMNAME, PRIMARY_ITEMNAME, null)) .addUIFormInput(new UIFormStringInput(SUPER_TYPE, SUPER_TYPE, null) .addValidator(MandatoryValidator.class)) .addUIFormInput(new UIFormInputInfo(PROPERTY_DEFINITIONS, PROPERTY_DEFINITIONS, null)) .addUIFormInput(new UIFormInputInfo(CHILDNODE_DEFINITIONS, CHILDNODE_DEFINITIONS, null)); setActionInTab(nodeTypeTab) ; addUIComponentInput(nodeTypeTab) ; UIFormInputSetWithAction propertiesTab = new UIPropertyDefinitionForm(PROPERTY_DEFINITION) ; setActionInTab(propertiesTab) ; addUIComponentInput(propertiesTab) ; UIFormInputSetWithAction childTab = new UIChildNodeDefinitionForm(CHILDNODE_DEFINITION) ; setActionInTab(childTab) ; addUIComponentInput(childTab) ; setSelectedTab(NODETYPE_DEFINITION); } public void setActionInTab(UIFormInputSetWithAction tab) { if(tab.getId().equals(NODETYPE_DEFINITION)) { tab.setActionInfo(SUPER_TYPE, new String[] {"AddSuperType"}) ; tab.setActions(new String[] {ACTION_SAVE, ACTION_SAVEDRAFT, ACTION_CANCEL}, null) ; setSelectedTab(tab.getId()) ; } else if(tab.getId().equals(CHILDNODE_DEFINITION)) { tab.setActionInfo(UIChildNodeDefinitionForm.DEFAULT_PRIMARY_TYPE, new String[] {"AddDefaultType"}) ; tab.setActionInfo(UIChildNodeDefinitionForm.REQUIRED_PRIMARY_TYPE, new String[] {"AddRequiredType"}) ; tab.setActions(new String[] {ADD_CHILD}, null) ; } else if(tab.getId().equals(PROPERTY_DEFINITION)) { tab.setActionInfo(UIPropertyDefinitionForm.VALUE_CONSTRAINTS, new String[] {"AddConstraints"}) ; tab.setActions(new String[] {ADD_PROPERTY}, null) ; } } public String[] getActions() { return null ; } public String getLabel(ResourceBundle res, String id) { String label = getId() + ".label." + id ; try { return res.getString(label) ; } catch(Exception e) { return id ; } } public List<SelectItemOption<String>> getNamespaces() throws Exception { if (namespacesOptions_.size() == 0) { String[] namespaces = getApplicationComponent(RepositoryService.class) .getCurrentRepository().getNamespaceRegistry().getPrefixes() ; for(int i = 0; i < namespaces.length; i ++){ namespacesOptions_.add(new SelectItemOption<String>(namespaces[i], namespaces[i])) ; } } return namespacesOptions_ ; } public void setChildValue(List<NodeDefinitionValue> listChildNode) throws Exception { StringBuilder childNodes = new StringBuilder() ; if(listChildNode == null) return ; for(NodeDefinitionValue node : listChildNode) { if(childNodes.length() > 0) childNodes.append(",") ; childNodes.append(node.getName()) ; } UIFormInputSetWithAction nodeTypeTab = getChildById(NODETYPE_DEFINITION) ; nodeTypeTab.setInfoField(CHILDNODE_DEFINITIONS, childNodes.toString()) ; String[] actionInfor = {"EditChildNode", "RemoveChildNode"} ; nodeTypeTab.setActionInfo(CHILDNODE_DEFINITIONS, actionInfor) ; } public void removeChildTabs(String[] tabNames) { for(int i = 0; i < tabNames.length ; i++) { removeChildById(tabNames[i]) ; } } public void setPropertyValue(List<PropertyDefinitionValue> listProperty) throws Exception { StringBuilder propertyValues = new StringBuilder() ; if(listProperty == null) return ; for(PropertyDefinitionValue property : listProperty) { if(propertyValues.length() > 0) propertyValues.append(",") ; propertyValues.append(property.getName()) ; } UIFormInputSetWithAction nodeTypeTab = getChildById(NODETYPE_DEFINITION) ; nodeTypeTab.setInfoField(PROPERTY_DEFINITIONS, propertyValues.toString()); String[] actionInfor = {"EditProperty", "RemoveProperty"} ; nodeTypeTab.setActionInfo(PROPERTY_DEFINITIONS, actionInfor) ; } private void setChildDefinitions(NodeDefinition[] childDef) throws Exception { StringBuilder childDefinitions = new StringBuilder() ; if(childDef != null) { for(int i = 0 ; i < childDef.length ; i++) { if(childDefinitions.length() > 0) childDefinitions.append(",") ; childDefinitions.append(childDef[i].getName()) ; } } UIFormInputSetWithAction nodeTypeTab = getChildById(NODETYPE_DEFINITION) ; nodeTypeTab.setInfoField(CHILDNODE_DEFINITIONS, childDefinitions.toString()); String[] actionInfor = {"ViewChildNode"} ; nodeTypeTab.setIsView(true) ; nodeTypeTab.setActionInfo(CHILDNODE_DEFINITIONS, actionInfor) ; } private void setPropertyDefinitions(PropertyDefinition[] propertyDef) throws Exception { StringBuilder propertyDefinitions = new StringBuilder() ; if(propertyDef != null) { for(int i = 0; i < propertyDef.length; i++) { if(propertyDefinitions.length() > 0) propertyDefinitions.append(",") ; propertyDefinitions.append(propertyDef[i].getName()) ; } } UIFormInputSetWithAction nodeTypeTab = getChildById(NODETYPE_DEFINITION) ; nodeTypeTab.setInfoField(PROPERTY_DEFINITIONS, propertyDefinitions.toString()); String[] actionInfor = {"ViewProperty"} ; nodeTypeTab.setIsView(true) ; nodeTypeTab.setActionInfo(PROPERTY_DEFINITIONS, actionInfor) ; } public void update(NodeType nodeType, boolean isView) throws Exception{ namespacesOptions_.clear() ; mixinTypeOptions_.add(new SelectItemOption<String>(FALSE, FALSE)) ; mixinTypeOptions_.add(new SelectItemOption<String>(TRUE, TRUE)) ; orderAbleOptions_.add(new SelectItemOption<String>(FALSE, FALSE)) ; orderAbleOptions_.add(new SelectItemOption<String>(TRUE, TRUE)) ; if(nodeType == null) { refresh() ; setActionInTab((UIFormInputSetWithAction)getChildById(NODETYPE_DEFINITION)) ; setActionInTab((UIFormInputSetWithAction)getChildById(CHILDNODE_DEFINITION)) ; setActionInTab((UIFormInputSetWithAction)getChildById(PROPERTY_DEFINITION)) ; return ; } String fullName = nodeType.getName() ; String nodeTypeName = fullName ; String namespacesPrefix = ""; if(fullName.indexOf(":") > -1) { nodeTypeName = fullName.substring(fullName.indexOf(":") + 1) ; namespacesPrefix = fullName.substring(0, fullName.indexOf(":")) ; } getUIStringInput(NODETYPE_NAME).setValue(nodeTypeName) ; getUIFormSelectBox(NAMESPACE).setOptions(getNamespaces()) ; getUIFormSelectBox(NAMESPACE).setValue(namespacesPrefix) ; getUIStringInput(PRIMARY_ITEMNAME).setValue(nodeType.getPrimaryItemName()) ; getUIFormSelectBox(MIXIN_TYPE).setValue(String.valueOf(nodeType.isMixin())) ; String orderableChildNodes = String.valueOf(nodeType.hasOrderableChildNodes()) ; getUIFormSelectBox(HAS_ORDERABLE_CHILDNODES).setValue(orderableChildNodes) ; NodeType[] superType = nodeType.getSupertypes() ; StringBuilder types = new StringBuilder(); for(int i = 0; i < superType.length; i++){ if(types.length() > 0) types.append(", ") ; types.append(superType[i].getName()) ; } getUIStringInput(SUPER_TYPE).setValue(types.toString()) ; if (nodeType.isMixin() && getUIStringInput(SUPER_TYPE).getValidators().size() > 0) { removeMandatoryValidator(); } if(isView) { getUIFormSelectBox(NAMESPACE).setDisabled(true) ; getUIStringInput(NODETYPE_NAME).setReadOnly(true); getUIStringInput(PRIMARY_ITEMNAME).setReadOnly(true); getUIFormSelectBox(MIXIN_TYPE).setDisabled(true) ; getUIFormSelectBox(HAS_ORDERABLE_CHILDNODES).setDisabled(true); getUIStringInput(SUPER_TYPE).setReadOnly(true); UIPropertyDefinitionForm uiPropertyForm = getChild(UIPropertyDefinitionForm.class) ; uiPropertyForm.update(nodeType, null) ; UIChildNodeDefinitionForm uiChildNodeForm = getChild(UIChildNodeDefinitionForm.class) ; uiChildNodeForm.update(nodeType, null) ; UIFormInputSetWithAction uiNodeTypeTab = getChildById(CHILDNODE_DEFINITION) ; uiNodeTypeTab.setIsView(true) ; } propertyDefinitions_ = nodeType.getPropertyDefinitions() ; childNodeDefinitions_ = nodeType.getChildNodeDefinitions() ; setChildDefinitions(childNodeDefinitions_) ; setPropertyDefinitions(propertyDefinitions_) ; nodeType_ = nodeType ; } public void setChildDraftNode(Node draftNodeType) throws Exception { addedChildDef_ = new ArrayList<NodeDefinitionValue>() ; if(!draftNodeType.hasNode(CHILD_NODE_DEFINITIONS)) return ; Node childNodeHome = draftNodeType.getNode(CHILD_NODE_DEFINITIONS) ; NodeIterator childIter = childNodeHome.getNodes() ; while(childIter.hasNext()) { Node childDef = childIter.nextNode() ; NodeDefinitionValue nodeTypeValue = new NodeDefinitionValue(); nodeTypeValue.setName(childDef.getName()) ; String defaultPriType = childDef.getProperty(UIChildNodeDefinitionForm.DEFAULT_PRIMARY_TYPE).getString() ; nodeTypeValue.setDefaultNodeTypeName(defaultPriType) ; String sameName = childDef.getProperty(UIChildNodeDefinitionForm.SAME_NAME).getString() ; nodeTypeValue.setSameNameSiblings(Boolean.parseBoolean(sameName)) ; String mandatory = childDef.getProperty(UIChildNodeDefinitionForm.MANDATORY).getString() ; nodeTypeValue.setMandatory(Boolean.parseBoolean(mandatory)) ; String autoCreate = childDef.getProperty(UIChildNodeDefinitionForm.AUTOCREATED).getString() ; nodeTypeValue.setAutoCreate(Boolean.parseBoolean(autoCreate)) ; String isProtected = childDef.getProperty(UIChildNodeDefinitionForm.PROTECTED).getString() ; nodeTypeValue.setReadOnly(Boolean.parseBoolean(isProtected)) ; String parentVer = childDef.getProperty(ON_PARENT_VERSION).getString() ; nodeTypeValue.setOnVersion(Integer.parseInt(parentVer)) ; String requiredTypes = childDef.getProperty(UIChildNodeDefinitionForm.REQUIRED_PRIMARY_TYPE).getString() ; List<String> requiredList = new ArrayList<String>() ; if(requiredTypes != null && requiredTypes.length() > 0) { if(requiredTypes.indexOf(",") > -1){ String[] array = requiredTypes.split(",") ; for(int i = 0; i < array.length; i ++) { requiredList.add(array[i].trim()) ; } } else { requiredList.add(requiredTypes) ; } } nodeTypeValue.setRequiredNodeTypeNames(requiredList) ; addedChildDef_.add(nodeTypeValue) ; setChildValue(addedChildDef_) ; } } public void setPropertyDraftNode(Node draftNodeType) throws Exception { addedPropertiesDef_ = new ArrayList<PropertyDefinitionValue>() ; if(!draftNodeType.hasNode(PROPERTY_DEFINITIONS_NODE)) return ; Node propertiesHome = draftNodeType.getNode(PROPERTY_DEFINITIONS_NODE) ; NodeIterator proIter = propertiesHome.getNodes() ; while (proIter.hasNext()) { Node proDef = proIter.nextNode() ; PropertyDefinitionValue propertyInfo = new PropertyDefinitionValue() ; propertyInfo.setName(proDef.getName()) ; String requiredType = proDef.getProperty(UIPropertyDefinitionForm.REQUIRED_TYPE).getString() ; propertyInfo.setRequiredType(Integer.parseInt(requiredType)) ; String multiple = proDef.getProperty(UIPropertyDefinitionForm.MULTIPLE).getString() ; propertyInfo.setMultiple(Boolean.parseBoolean(multiple)) ; String mandatory = proDef.getProperty(UIPropertyDefinitionForm.MANDATORY).getString() ; propertyInfo.setMandatory(Boolean.parseBoolean(mandatory)) ; String autoCreate = proDef.getProperty(UIPropertyDefinitionForm.AUTOCREATED).getString() ; propertyInfo.setAutoCreate(Boolean.parseBoolean(autoCreate)) ; String isProtected = proDef.getProperty(UIPropertyDefinitionForm.PROTECTED).getString() ; propertyInfo.setReadOnly(Boolean.parseBoolean(isProtected)) ; String onParent = proDef.getProperty(ON_PARENT_VERSION).getString() ; propertyInfo.setOnVersion(Integer.parseInt(onParent)) ; String constraints = proDef.getProperty(UIPropertyDefinitionForm.CONSTRAINTS).getString() ; List<String> valueConst = new ArrayList<String>() ; if(constraints != null && constraints.length() > 0) { if(constraints.indexOf(",") > -1) { String[] array = constraints.split(",") ; for(int i = 0; i < array.length; i ++) { valueConst.add(array[i].trim()) ; } } else { valueConst.add(constraints) ; } } propertyInfo.setValueConstraints(valueConst) ; addedPropertiesDef_.add(propertyInfo) ; setPropertyValue(addedPropertiesDef_) ; } } public void updateEdit(Node draftNodeType, boolean isDraft) throws Exception{ isDraft_ = isDraft ; getUIFormSelectBox(NAMESPACE).setOptions(getNamespaces()) ; String name = draftNodeType.getName() ; String noteTypeName = name ; String namespacesPrefix = ""; if(name.indexOf(":") > -1) { noteTypeName = name.substring(name.indexOf(":") + 1) ; namespacesPrefix = name.substring(0, name.indexOf(":")) ; } getUIStringInput(NODETYPE_NAME).setValue(noteTypeName) ; getUIFormSelectBox(NAMESPACE).setValue(namespacesPrefix) ; getUIStringInput(NODETYPE_NAME).setReadOnly(true); if (draftNodeType.hasProperty(PRIMARY_ITEMNAME)) { String primaryItem = draftNodeType.getProperty(PRIMARY_ITEMNAME).getString() ; getUIStringInput(PRIMARY_ITEMNAME).setValue(primaryItem) ; } getUIFormSelectBox(MIXIN_TYPE).setValue(draftNodeType.getProperty(IS_MIX_IN).getString()) ; String hasOrderable = draftNodeType.getProperty(HAS_ORDERABLE_CHILDNODES).getString() ; getUIFormSelectBox(HAS_ORDERABLE_CHILDNODES).setValue(hasOrderable) ; if (draftNodeType.hasProperty(SUPER_TYPE)) { getUIStringInput(SUPER_TYPE).setValue(draftNodeType.getProperty(SUPER_TYPE).getString()) ; } getUIFormSelectBox(NAMESPACE).setDisabled(true) ; getUIStringInput(NODETYPE_NAME).setReadOnly(true); getUIStringInput(PRIMARY_ITEMNAME).setReadOnly(false); getUIFormSelectBox(MIXIN_TYPE).setDisabled(false) ; getUIFormSelectBox(HAS_ORDERABLE_CHILDNODES).setDisabled(false); getUIStringInput(SUPER_TYPE).setReadOnly(false); setChildDraftNode(draftNodeType) ; setPropertyDraftNode(draftNodeType) ; setActionInTab((UIFormInputSetWithAction)getChildById(NODETYPE_DEFINITION)) ; setActionInTab((UIFormInputSetWithAction)getChildById(CHILDNODE_DEFINITION)) ; setActionInTab((UIFormInputSetWithAction)getChildById(PROPERTY_DEFINITION)) ; } public void refresh() throws Exception{ UIChildNodeDefinitionForm uiChildNodeTab = getChild(UIChildNodeDefinitionForm.class) ; UIPropertyDefinitionForm uiPropertyTab = getChild(UIPropertyDefinitionForm.class) ; getUIFormSelectBox(NAMESPACE).setOptions(getNamespaces()).setDisabled(false) ; getUIStringInput(NODETYPE_NAME).setReadOnly(false).setValue(null) ; getUIStringInput(PRIMARY_ITEMNAME).setReadOnly(false).setValue(null) ; getUIStringInput(SUPER_TYPE).setReadOnly(false).setValue(null) ; getUIFormSelectBox(MIXIN_TYPE).setOptions(mixinTypeOptions_).setDisabled(false) ; getUIFormSelectBox(HAS_ORDERABLE_CHILDNODES).setOptions(orderAbleOptions_).setDisabled(false) ; getUIFormInputInfo(PROPERTY_DEFINITIONS).setValue(null) ; getUIFormInputInfo(CHILDNODE_DEFINITIONS).setValue(null) ; addedPropertiesDef_ = new ArrayList<PropertyDefinitionValue>(); addedChildDef_ = new ArrayList<NodeDefinitionValue>(); UIFormInputSetWithAction uiNodeTypeTab = getChildById(NODETYPE_DEFINITION) ; setSelectedTab(uiNodeTypeTab.getId()) ; //uiNodeTypeTab.setRendered(true) ; uiNodeTypeTab.setIsView(false) ; setActionInTab(uiNodeTypeTab) ; setChildDefinitions(null) ; setPropertyDefinitions(null) ; setChildValue(null) ; setPropertyValue(null) ; uiChildNodeTab.refresh() ; uiPropertyTab.refresh() ; } public void setTabRender(String tabName) { for(UIComponent uiComp : getChildren()) { UIFormInputSetWithAction tab = getChildById(uiComp.getId()) ; if(tab.getId().equals(tabName)) setSelectedTab(tab.getId()) ; } } static public class CancelActionListener extends EventListener<UINodeTypeForm> { public void execute(Event<UINodeTypeForm> event) throws Exception { UINodeTypeForm uiForm = event.getSource() ; uiForm.update(null, false) ; uiForm.refresh() ; UIPopupWindow uiPopup = uiForm.getParent() ; uiPopup.setRendered(false) ; uiPopup.setShow(false) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiForm) ; } } static public class CloseActionListener extends EventListener<UINodeTypeForm> { public void execute(Event<UINodeTypeForm> event) throws Exception { UINodeTypeForm uiForm = event.getSource() ; uiForm.update(null, false) ; uiForm.refresh() ; UIPopupWindow uiPopup = uiForm.getParent() ; uiPopup.setRendered(false) ; uiPopup.setShow(false) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent()) ; } } static public class ViewPropertyActionListener extends EventListener<UINodeTypeForm> { public void execute(Event<UINodeTypeForm> event) throws Exception { UINodeTypeForm uiForm = event.getSource() ; String propertyName = event.getRequestContext().getRequestParameter(OBJECTID) ; UIPropertyDefinitionForm uiPropertyForm = uiForm.getChild(UIPropertyDefinitionForm.class) ; uiPropertyForm.update(uiForm.nodeType_, propertyName) ; uiPropertyForm.setRendered(true) ; uiForm.setTabRender(PROPERTY_DEFINITION) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent()) ; } } static public class ViewChildNodeActionListener extends EventListener<UINodeTypeForm> { public void execute(Event<UINodeTypeForm> event) throws Exception { UINodeTypeForm uiForm = event.getSource() ; String childNodeName = event.getRequestContext().getRequestParameter(OBJECTID) ; UIChildNodeDefinitionForm uiChildNodeForm = uiForm.getChild(UIChildNodeDefinitionForm.class) ; uiChildNodeForm.update(uiForm.nodeType_, childNodeName) ; uiChildNodeForm.setRendered(true) ; uiForm.setTabRender(CHILDNODE_DEFINITION) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent()) ; } } static public class SaveActionListener extends EventListener<UINodeTypeForm> { public void execute(Event<UINodeTypeForm> event) throws Exception { UINodeTypeForm uiForm = event.getSource() ; UIApplication uiApp = uiForm.getAncestorOfType(UIApplication.class) ; NodeTypeManager ntManager = uiForm.getApplicationComponent(RepositoryService.class) .getCurrentRepository().getNodeTypeManager() ; String prefix = uiForm.getUIFormSelectBox(NAMESPACE).getValue() ; String nodeTypeName = uiForm.getUIStringInput(NODETYPE_NAME).getValue() ; if(nodeTypeName == null || nodeTypeName.trim().length() == 0) { uiApp.addMessage(new ApplicationMessage("UINodeTypeForm.msg.nodeType-name", null, ApplicationMessage.WARNING)) ; uiForm.setTabRender(NODETYPE_DEFINITION) ; return ; } if (prefix != null && prefix.length() > 0) { StringBuffer sb = new StringBuffer(); sb.append(prefix).append(":").append(nodeTypeName); nodeTypeName = sb.toString(); } String superTypes = uiForm.getUIStringInput(SUPER_TYPE).getValue() ; if(uiForm.getUIFormSelectBox(MIXIN_TYPE).getValue().equals("false")) { if(superTypes == null || superTypes.trim().length() == 0) { uiApp.addMessage(new ApplicationMessage("UINodeTypeForm.msg.supertype-is-madatory", null, ApplicationMessage.WARNING)) ; uiForm.setTabRender(NODETYPE_DEFINITION) ; return ; } } List<String> listTypes = new ArrayList<String>() ; if(superTypes != null) { if(superTypes.indexOf(",") > -1) { String[] arrayTypes = superTypes.split(",") ; for(String type :arrayTypes ) { listTypes.add(type.trim()) ; } } else { listTypes.add(superTypes.trim()) ; } } String primaryItemName = uiForm.getUIStringInput(PRIMARY_ITEMNAME).getValue() ; NodeTypeValue newNodeType = new NodeTypeValue() ; newNodeType.setName(nodeTypeName) ; newNodeType.setPrimaryItemName(primaryItemName) ; newNodeType.setMixin(Boolean.parseBoolean(uiForm.getUIFormSelectBox(MIXIN_TYPE).getValue())) ; String orderableChild = uiForm.getUIFormSelectBox(HAS_ORDERABLE_CHILDNODES).getValue() ; newNodeType.setOrderableChild(Boolean.parseBoolean(orderableChild)) ; newNodeType.setDeclaredSupertypeNames(listTypes) ; newNodeType.setDeclaredPropertyDefinitionValues(uiForm.addedPropertiesDef_) ; newNodeType.setDeclaredChildNodeDefinitionValues(uiForm.addedChildDef_) ; ExtendedNodeTypeManager extNTManager = (ExtendedNodeTypeManager)ntManager ; try { extNTManager.registerNodeType(newNodeType, ExtendedNodeTypeManager.FAIL_IF_EXISTS) ; } catch(Exception e) { uiApp.addMessage(new ApplicationMessage("UINodeTypeForm.msg.register-failed", null, ApplicationMessage.WARNING)) ; uiForm.setTabRender(NODETYPE_DEFINITION) ; return ; } UINodeTypeManager uiManager = uiForm.getAncestorOfType(UINodeTypeManager.class) ; UINodeTypeList nodeTypeList = uiManager.getChild(UINodeTypeList.class) ; if(uiForm.isDraft_){ uiForm.isDraft_ = false ; nodeTypeList.refresh(nodeTypeName, nodeTypeList.getUIPageIterator().getCurrentPage()); } else { nodeTypeList.refresh(null, nodeTypeList.getUIPageIterator().getCurrentPage()); } uiForm.refresh() ; uiForm.setTabRender(NODETYPE_DEFINITION) ; UIPopupWindow uiPopup = uiForm.getParent() ; uiPopup.setRendered(false) ; uiPopup.setShowMask(true); Object[] args = { newNodeType.getName() } ; uiApp.addMessage(new ApplicationMessage("UINodeTypeForm.msg.register-successfully", args)) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; } } static public class SaveDraftActionListener extends EventListener<UINodeTypeForm> { public void execute(Event<UINodeTypeForm> event) throws Exception { UINodeTypeForm uiForm = event.getSource() ; UIApplication uiApp = uiForm.getAncestorOfType(UIApplication.class) ; ManageableRepository mRepository = uiForm.getApplicationComponent(RepositoryService.class).getCurrentRepository() ; String systemWorkspace = mRepository.getConfiguration().getDefaultWorkspaceName() ; Session session = mRepository.getSystemSession(systemWorkspace) ; String prefix = uiForm.getUIFormSelectBox(NAMESPACE).getValue() ; String nodeTypeName = uiForm.getUIStringInput(NODETYPE_NAME).getValue().trim(); if(nodeTypeName == null || nodeTypeName.trim().length() == 0) { uiApp.addMessage(new ApplicationMessage("UINodeTypeForm.msg.nodeType-name", null, ApplicationMessage.WARNING)) ; uiForm.setTabRender(NODETYPE_DEFINITION) ; session.logout(); return ; } if (prefix != null && prefix.length() > 0) { StringBuffer sb = new StringBuffer(); sb.append(prefix).append(":").append(nodeTypeName); nodeTypeName = sb.toString(); } Node systemNode = (Node)session.getItem("/jcr:system") ; Node nodeTypeDraft ; if(systemNode.hasNode(JCR_NODETYPE_DRAFT)) { nodeTypeDraft = systemNode.getNode(JCR_NODETYPE_DRAFT) ; } else { nodeTypeDraft = systemNode.addNode(JCR_NODETYPE_DRAFT, NT_UNSTRUCTURED) ; } systemNode.save() ; Node newNode ; if(nodeTypeDraft.hasNode(nodeTypeName)) newNode = nodeTypeDraft.getNode(nodeTypeName) ; else newNode = nodeTypeDraft.addNode(nodeTypeName, NT_UNSTRUCTURED) ; nodeTypeDraft.save() ; newNode.setProperty(PRIMARY_ITEMNAME, uiForm.getUIStringInput(PRIMARY_ITEMNAME).getValue()) ; newNode.setProperty(IS_MIX_IN, uiForm.getUIFormSelectBox(MIXIN_TYPE).getValue()) ; String hasOrderable = uiForm.getUIFormSelectBox(HAS_ORDERABLE_CHILDNODES).getValue() ; newNode.setProperty(HAS_ORDERABLE_CHILDNODES, hasOrderable) ; String superTypes = uiForm.getUIStringInput(SUPER_TYPE).getValue() ; newNode.setProperty(SUPER_TYPE, superTypes) ; newNode.save() ; nodeTypeDraft.save() ; if(uiForm.addedPropertiesDef_ .size() > 0) { Node propertyDef ; if(newNode.hasNode(PROPERTY_DEFINITIONS_NODE)) { propertyDef = newNode.getNode(PROPERTY_DEFINITIONS_NODE) ; } else { propertyDef = newNode.addNode(PROPERTY_DEFINITIONS_NODE, NT_UNSTRUCTURED) ; } newNode.save() ; propertyDef.save() ; for(int i = 0; i < uiForm.addedPropertiesDef_.size(); i ++) { PropertyDefinitionValue property = uiForm.addedPropertiesDef_.get(i) ; Node propertyNode ; if(propertyDef.hasNode(property.getName())) { propertyNode = propertyDef.getNode(property.getName()) ; } else { propertyNode = propertyDef.addNode(property.getName(), NT_UNSTRUCTURED) ; propertyNode.setProperty(PROPERTY_NAME, property.getName()) ; } String requiredType = String.valueOf(property.getRequiredType()) ; propertyNode.setProperty(UIPropertyDefinitionForm.REQUIRED_TYPE, requiredType) ; String autoCreate = String.valueOf(property.isAutoCreate()) ; propertyNode.setProperty(UIPropertyDefinitionForm.AUTOCREATED, autoCreate) ; String isProtected = String.valueOf(property.isReadOnly()) ; propertyNode.setProperty(UIPropertyDefinitionForm.PROTECTED, isProtected) ; String mandatory = String.valueOf(property.isMandatory()) ; propertyNode.setProperty(UIPropertyDefinitionForm.MANDATORY, mandatory) ; propertyNode.setProperty(ON_PARENT_VERSION, String.valueOf(property.getOnVersion())) ; String multiple = String.valueOf(property.isMultiple()) ; propertyNode.setProperty(UIPropertyDefinitionForm.MULTIPLE, multiple) ; List<String> valueConstraint = property.getValueConstraints() ; StringBuilder values = new StringBuilder() ; for(int j = 0; j < valueConstraint.size(); j ++) { if(values.length() > 0) values.append(", ") ; values.append(valueConstraint.get(j).toString()) ; } propertyNode.setProperty(UIPropertyDefinitionForm.CONSTRAINTS, values.toString()) ; propertyDef.save() ; propertyNode.save() ; } } if(uiForm.addedChildDef_.size() > 0) { Node childDef ; if(newNode.hasNode(CHILD_NODE_DEFINITIONS)) { childDef = newNode.getNode(CHILD_NODE_DEFINITIONS) ; } else { childDef = newNode.addNode(CHILD_NODE_DEFINITIONS, NT_UNSTRUCTURED) ; } newNode.save() ; childDef.save() ; for(int i = 0; i < uiForm.addedChildDef_.size(); i ++ ){ NodeDefinitionValue nodeDef = uiForm.addedChildDef_.get(i) ; Node childNode ; if(childDef.hasNode(nodeDef.getName())) { childNode = childDef.getNode(nodeDef.getName()) ; } else { childNode = childDef.addNode(nodeDef.getName(), NT_UNSTRUCTURED) ; childNode.setProperty(PROPERTY_NAME, nodeDef.getName()) ; } String defaultPrimaryType = nodeDef.getDefaultNodeTypeName() ; childNode.setProperty(UIChildNodeDefinitionForm.DEFAULT_PRIMARY_TYPE, defaultPrimaryType) ; String autoCreate = String.valueOf(nodeDef.isAutoCreate()) ; childNode.setProperty(UIChildNodeDefinitionForm.AUTOCREATED, autoCreate) ; String isProtected = String.valueOf(nodeDef.isReadOnly()) ; childNode.setProperty(UIChildNodeDefinitionForm.PROTECTED, isProtected) ; String mandatory = String.valueOf(nodeDef.isMandatory()) ; childNode.setProperty(UIChildNodeDefinitionForm.MANDATORY, mandatory) ; childNode.setProperty(ON_PARENT_VERSION, String.valueOf(nodeDef.getOnVersion())) ; String sameName = String.valueOf(nodeDef.isSameNameSiblings()) ; childNode.setProperty(UIChildNodeDefinitionForm.SAME_NAME, sameName) ; if(nodeDef.getRequiredNodeTypeNames().size() > 0 ) { StringBuilder requiredTypes = new StringBuilder("") ; for(int j = 0; j < nodeDef.getRequiredNodeTypeNames().size(); j ++) { if( requiredTypes.length() > 0) requiredTypes.append(",") ; requiredTypes.append(nodeDef.getRequiredNodeTypeNames().get(j).toString()) ; } childNode.setProperty(UIChildNodeDefinitionForm.REQUIRED_PRIMARY_TYPE, requiredTypes.toString()) ; } else { childNode.setProperty(UIChildNodeDefinitionForm.REQUIRED_PRIMARY_TYPE, "") ; } childDef.save() ; childNode.save() ; } } session.save() ; session.logout(); UINodeTypeManager uiManager = uiForm.getAncestorOfType(UINodeTypeManager.class) ; UINodeTypeList nodeTypeList = uiManager.getChild(UINodeTypeList.class) ; nodeTypeList.refresh(null, nodeTypeList.getUIPageIterator().getCurrentPage()); uiForm.refresh() ; uiForm.setTabRender(NODETYPE_DEFINITION) ; UIPopupWindow uiPopup = uiForm.getParent() ; uiPopup.setRendered(false) ; uiPopup.setShowMask(true); event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; } } static public class AddSuperTypeActionListener extends EventListener<UINodeTypeForm> { public void execute(Event<UINodeTypeForm> event) throws Exception { UINodeTypeForm uiForm = event.getSource() ; UIFormInputSetWithAction superTypeTab = new UINodeTypeOptionList(SUPER_TYPE_TAB) ; uiForm.removeChildTabs(new String[] {DEFAULT_PRIMARY_TYPE_TAB, REQUIRED_PRIMARY_TYPE_TAB}) ; if(superTypeTab.isRendered()) uiForm.removeChildById(SUPER_TYPE_TAB) ; String[] actionNames = new String[] {ADD_TYPE, ACTION_CANCEL_TAB} ; String[] fieldNames = new String[] {SUPER_TYPE, SUPER_TYPE_TAB} ; superTypeTab.setActions(actionNames, fieldNames) ; uiForm.addUIComponentInput(superTypeTab) ; uiForm.setTabRender(SUPER_TYPE_TAB) ; UINodeTypeOptionList uiOptionList = uiForm.getChild(UINodeTypeOptionList.class) ; String superTypeValue = uiForm.getUIStringInput(SUPER_TYPE).getValue() ; uiOptionList.update(superTypeValue) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiForm.getParent()) ; } } static public class SelectTabActionListener extends EventListener<UINodeTypeForm> { public void execute(Event<UINodeTypeForm> event) throws Exception { WebuiRequestContext context = event.getRequestContext(); String renderTab = context.getRequestParameter(UIComponent.OBJECTID); if (renderTab == null) return; event.getSource().setSelectedTab(renderTab); WebuiRequestContext parentContext = (WebuiRequestContext)context.getParentAppRequestContext(); if (parentContext != null) { parentContext.setResponseComplete(true); } else { context.setResponseComplete(true); } } } static public class IsMixinActionListener extends EventListener<UINodeTypeForm> { public void execute(Event<UINodeTypeForm> event) throws Exception { UINodeTypeForm uiForm = event.getSource(); if (uiForm.getUIFormSelectBox(MIXIN_TYPE).getValue().equals("true") && uiForm.getUIStringInput(SUPER_TYPE).getValidators().size() > 0) { uiForm.removeMandatoryValidator(); } if (uiForm.getUIFormSelectBox(MIXIN_TYPE).getValue().equals("false")) { if (uiForm.getUIStringInput(SUPER_TYPE).getValidators().size() == 0) { uiForm.getUIStringInput(SUPER_TYPE).addValidator(MandatoryValidator.class); } else { boolean isMandatoryValidator = false; List<Validator> validators = uiForm.getUIStringInput(SUPER_TYPE).getValidators(); for (Object obj: validators) { if (obj instanceof MandatoryValidator) { isMandatoryValidator = true; } } if (!isMandatoryValidator) { uiForm.getUIStringInput(SUPER_TYPE).addValidator(MandatoryValidator.class); } } } } } private void removeMandatoryValidator() { List<Validator> validators = getUIStringInput(SUPER_TYPE).getValidators(); int index = -1; for (int i = 0; i < validators.size(); i++) { if ((validators.get(i) instanceof MandatoryValidator)) { index = i; break; } } if (index > -1) { validators.remove(index); } } }