/* * 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.io.ByteArrayInputStream; import java.util.ArrayList; import java.util.List; import javax.jcr.nodetype.NodeDefinition; import javax.jcr.nodetype.NodeType; import javax.jcr.nodetype.NodeTypeIterator; import javax.jcr.nodetype.NodeTypeManager; import javax.jcr.nodetype.PropertyDefinition; import org.exoplatform.download.DownloadResource; import org.exoplatform.download.DownloadService; import org.exoplatform.download.InputStreamDownloadResource; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.web.application.ApplicationMessage; import org.exoplatform.web.application.RequireJS; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIApplication; import org.exoplatform.webui.core.UIPopupWindow; import org.exoplatform.webui.core.lifecycle.UIFormLifecycle; 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.UIFormInputInfo; import org.exoplatform.webui.form.UIFormInputSet; import org.exoplatform.webui.form.UIFormTableInputSet; import org.exoplatform.webui.form.input.UICheckBoxInput; /** * Created by The eXo Platform SARL * Author : Dang Van Minh * minh.dang@exoplatform.com * Sep 29, 2006 * 12:01:58 PM */ @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "classpath:groovy/ecm/webui/form/UIForm.gtmpl", events = { @EventConfig(listeners = UINodeTypeExport.ExportActionListener.class), @EventConfig(phase=Phase.DECODE, listeners = UINodeTypeExport.CancelActionListener.class), @EventConfig(listeners = UINodeTypeExport.UncheckAllActionListener.class), @EventConfig(listeners = UINodeTypeExport.CheckAllActionListener.class) } ) public class UINodeTypeExport extends UIForm { final static String TABLE_NAME = "UINodeTypeExport" ; final static String LABEL = "label" ; final static String INPUT = "input" ; final static String[] TABLE_COLUMNS = {LABEL, INPUT} ; private List<NodeType> nodeTypeList_ = new ArrayList<NodeType>() ; public UINodeTypeExport() throws Exception { } public void update() throws Exception { UIFormTableInputSet uiTableInputSet = createUIComponent(UIFormTableInputSet.class, null, null) ; NodeTypeManager ntManager = getApplicationComponent(RepositoryService.class) .getCurrentRepository().getNodeTypeManager() ; NodeTypeIterator nodeTypeIter = ntManager.getAllNodeTypes() ; UIFormInputSet uiInputSet ; uiTableInputSet.setName(TABLE_NAME); uiTableInputSet.setColumns(TABLE_COLUMNS); while(nodeTypeIter.hasNext()){ NodeType nt = nodeTypeIter.nextNodeType() ; nodeTypeList_.add(nt) ; String ntName = nt.getName() ; uiInputSet = new UIFormInputSet(ntName) ; UIFormInputInfo uiInfo = new UIFormInputInfo(LABEL, null, ntName); uiInputSet.addChild(uiInfo); UICheckBoxInput uiCheckbox = new UICheckBoxInput(ntName, ntName, true); uiInputSet.addChild(uiCheckbox); uiTableInputSet.addChild(uiInputSet); } setActions(new String[] {"Export", "Cancel", "UncheckAll"}) ; addUIFormInput(uiTableInputSet) ; } public String getLabel(String id) { return id ; } public NodeType getNodeTypeByName(String nodeTypeName) throws Exception { NodeType nodeTypeSelected = null ; for(NodeType node : nodeTypeList_) { if(node.getName().equals(nodeTypeName)) { nodeTypeSelected = node ; break ; } } return nodeTypeSelected ; } static public class ExportActionListener extends EventListener<UINodeTypeExport> { public void execute(Event<UINodeTypeExport> event) throws Exception { UINodeTypeExport uiExport = event.getSource() ; UINodeTypeManager uiManager = uiExport.getAncestorOfType(UINodeTypeManager.class) ; UIApplication uiApp = uiExport.getAncestorOfType(UIApplication.class) ; List<NodeType> selectedNodes = new ArrayList<NodeType>() ; List<UICheckBoxInput> listCheckbox = new ArrayList<UICheckBoxInput>(); uiExport.findComponentOfType(listCheckbox, UICheckBoxInput.class); for(int i = 0; i < listCheckbox.size(); i ++) { boolean checked = listCheckbox.get(i).isChecked() ; if(checked) selectedNodes.add(uiExport.getNodeTypeByName(listCheckbox.get(i).getName())) ; } if(selectedNodes.size() == 0) { uiApp.addMessage(new ApplicationMessage("UINodeTypeExport.msg.item-null", null)) ; return ; } String nodeTypeXML = getNodeTypeXML(selectedNodes) ; ByteArrayInputStream is = new ByteArrayInputStream(nodeTypeXML.getBytes()) ; DownloadResource dresource = new InputStreamDownloadResource(is, "text/xml") ; DownloadService dservice = uiExport.getApplicationComponent(DownloadService.class) ; dresource.setDownloadName("nodetype_export.xml"); String downloadLink = dservice.getDownloadLink(dservice.addDownloadResource(dresource)) ; RequireJS requireJS = event.getRequestContext().getJavascriptManager().getRequireJS(); requireJS.require("SHARED/ecm-utils", "ecmutil").addScripts("ecmutil.ECMUtils.ajaxRedirect('" + downloadLink + "');"); event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; UIPopupWindow uiPopup = uiManager.findComponentById(UINodeTypeManager.EXPORT_POPUP) ; uiPopup.setShowMask(true); uiPopup.setRendered(false) ; } private String getNodeTypeXML(List<NodeType> selectedNodes) { StringBuilder nodeTypeXML = new StringBuilder() ; nodeTypeXML.append("<nodeTypes xmlns:nt=").append("\"") ; nodeTypeXML.append("http://www.jcp.org/jcr/nt/1.5").append("\" ") ; nodeTypeXML.append("xmlns:mix=").append("\"") ; nodeTypeXML.append("http://www.jcp.org/jcr/mix/1.5").append("\" ") ; nodeTypeXML.append("xmlns:jcr=").append("\"").append("http://www.jcp.org/jcr/1.5") ; nodeTypeXML.append("\" >").append("\n") ; for(int i = 0; i < selectedNodes.size(); i++) { NodeType nodeType = selectedNodes.get(i) ; nodeTypeXML.append("<nodeType ") ; nodeTypeXML.append("name=").append("\"").append(nodeType.getName()).append("\" ") ; String isMixIn = String.valueOf(nodeType.isMixin()) ; nodeTypeXML.append("isMixin=").append("\"").append(String.valueOf(isMixIn)).append("\" ") ; String hasOrderable = String.valueOf(nodeType.hasOrderableChildNodes()) ; nodeTypeXML.append("hasOrderableChildNodes=\"").append(hasOrderable).append("\" ") ; String primaryItemName = ""; if(nodeType.getPrimaryItemName() != null) primaryItemName = nodeType.getPrimaryItemName() ; nodeTypeXML.append("primaryItemName=").append("\"").append(primaryItemName).append("\" >") ; nodeTypeXML.append("\n") ; // represent supertypes String representSuperType = representSuperTypes(nodeType) ; nodeTypeXML.append(representSuperType) ; // represent PropertiesDefinition String representPropertiesXML = representPropertyDefinition(nodeType) ; nodeTypeXML.append(representPropertiesXML) ; // represent ChildNodeDefinition String representChildXML = representChildNodeDefinition(nodeType) ; nodeTypeXML.append(representChildXML) ; nodeTypeXML.append("</nodeType>").append("\n") ; } nodeTypeXML.append("</nodeTypes>") ; return nodeTypeXML.toString() ; } private String representSuperTypes(NodeType nodeType){ StringBuilder superTypeXML = new StringBuilder() ; NodeType[] superType = nodeType.getDeclaredSupertypes() ; if(superType != null && superType.length > 0){ superTypeXML.append("<supertypes>").append("\n") ; for(int i = 0 ; i < superType.length ; i ++){ String typeName = superType[i].getName() ; superTypeXML.append("<supertype>").append(typeName).append("</supertype>").append("\n") ; } superTypeXML.append("</supertypes>").append("\n") ; } return superTypeXML.toString() ; } private String representPropertyDefinition(NodeType nodeType) { String[] requireType = {"undefined", "String", "Binary", "Long", "Double", "Date", "Boolean", "Name", "Path", "Reference"} ; String[] onparentVersion = {"", "COPY", "VERSION", "INITIALIZE", "COMPUTE", "IGNORE", "ABORT"} ; StringBuilder propertyXML = new StringBuilder() ; propertyXML.append("<propertyDefinitions>").append("\n") ; PropertyDefinition[] proDef = nodeType.getPropertyDefinitions() ; for(int j = 0 ; j < proDef.length; j ++) { propertyXML.append("<propertyDefinition ") ; propertyXML.append("name=").append("\"").append(proDef[j].getName()).append("\" ") ; String requiredValue = null ; if(proDef[j].getRequiredType() == 100) requiredValue = "Permission" ; else requiredValue = requireType[proDef[j].getRequiredType()] ; propertyXML.append("requiredType=").append("\"").append(requiredValue).append("\" ") ; String autoCreate = String.valueOf(proDef[j].isAutoCreated()) ; propertyXML.append("autoCreated=").append("\"").append(autoCreate).append("\" ") ; String mandatory = String.valueOf(proDef[j].isMandatory()) ; propertyXML.append("mandatory=").append("\"").append(mandatory).append("\" ") ; String onVersion = onparentVersion[proDef[j].getOnParentVersion()] ; propertyXML.append("onParentVersion=").append("\"").append(onVersion).append("\" ") ; String protect = String.valueOf(proDef[j].isProtected()) ; propertyXML.append("protected=").append("\"").append(protect).append("\" ") ; String multiple = String.valueOf(proDef[j].isMultiple()) ; propertyXML.append("multiple=").append("\"").append(multiple).append("\" >").append("\n") ; String[] constraints = proDef[j].getValueConstraints() ; if(constraints != null && constraints.length > 0) { propertyXML.append("<valueConstraints>").append("\n") ; for(int k = 0; k < constraints.length ; k ++) { String cons = constraints[k].toString() ; propertyXML.append("<valueConstraint>").append(cons).append("</valueConstraint>") ; propertyXML.append("\n") ; } propertyXML.append("</valueConstraints>").append("\n") ; } else { propertyXML.append("<valueConstraints/>").append("\n") ; } propertyXML.append("</propertyDefinition>").append("\n") ; } propertyXML.append("</propertyDefinitions>").append("\n") ; return propertyXML.toString() ; } private String representChildNodeDefinition(NodeType nodeType) { String[] onparentVersion = {"","COPY","VERSION","INITIALIZE","COMPUTE","IGNORE","ABORT"} ; StringBuilder childNodeXML = new StringBuilder() ; NodeDefinition[] childDef = nodeType.getChildNodeDefinitions() ; if(childDef != null && childDef.length > 0) { childNodeXML.append("<childNodeDefinitions>").append("\n") ; for(int j = 0 ; j < childDef.length ; j ++){ childNodeXML.append("<childNodeDefinition ") ; childNodeXML.append("name=").append("\"").append(childDef[j].getName()).append("\" ") ; NodeType defaultType = childDef[j].getDefaultPrimaryType() ; if(defaultType != null) { String defaultName = defaultType.getName() ; childNodeXML.append("defaultPrimaryType=").append("\"").append(defaultName).append("\" ") ; } else { childNodeXML.append("defaultPrimaryType=").append("\"").append("\" ") ; } String autoCreate = String.valueOf(childDef[j].isAutoCreated()) ; childNodeXML.append("autoCreated=").append("\"").append(autoCreate).append("\" ") ; String mandatory = String.valueOf(childDef[j].isMandatory()) ; childNodeXML.append("mandatory=").append("\"").append(mandatory).append("\" ") ; String onVersion = onparentVersion[childDef[j].getOnParentVersion()] ; childNodeXML.append("onParentVersion=").append("\"").append(onVersion).append("\" ") ; String protect = String.valueOf(childDef[j].isProtected()) ; childNodeXML.append("protected=").append("\"").append(protect).append("\" ") ; String sameName = String.valueOf(childDef[j].allowsSameNameSiblings()) ; childNodeXML.append("sameNameSiblings=").append("\"").append(sameName).append("\" >") ; childNodeXML.append("\n") ; NodeType[] requiredType = childDef[j].getRequiredPrimaryTypes() ; if(requiredType != null && requiredType.length > 0 ) { childNodeXML.append("<requiredPrimaryTypes>").append("\n") ; for(int k = 0 ; k < requiredType.length ; k ++) { String requiredName = requiredType[k].getName() ; childNodeXML.append("<requiredPrimaryType>").append(requiredName) ; childNodeXML.append("</requiredPrimaryType>").append("\n") ; } childNodeXML.append("</requiredPrimaryTypes>").append("\n") ; } childNodeXML.append("</childNodeDefinition>").append("\n") ; } childNodeXML.append("</childNodeDefinitions>").append("\n") ; } return childNodeXML.toString() ; } } static public class CancelActionListener extends EventListener<UINodeTypeExport> { public void execute(Event<UINodeTypeExport> event) throws Exception { UINodeTypeExport uiExport = event.getSource() ; UINodeTypeManager uiManager = uiExport.getAncestorOfType(UINodeTypeManager.class) ; UIPopupWindow uiPopup = uiManager.findComponentById(UINodeTypeManager.EXPORT_POPUP) ; uiPopup.setShowMask(true); uiPopup.setRendered(false) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; } } static public class UncheckAllActionListener extends EventListener<UINodeTypeExport> { public void execute(Event<UINodeTypeExport> event) throws Exception { UINodeTypeExport uiExport = event.getSource() ; List<UICheckBoxInput> listCheckbox = new ArrayList<UICheckBoxInput>(); uiExport.findComponentOfType(listCheckbox, UICheckBoxInput.class); for(int i = 0; i < listCheckbox.size(); i ++) { listCheckbox.get(i).setChecked(false) ; } uiExport.setActions(new String[] {"Export", "Cancel", "CheckAll"}) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiExport.getParent()) ; } } static public class CheckAllActionListener extends EventListener<UINodeTypeExport> { public void execute(Event<UINodeTypeExport> event) throws Exception { UINodeTypeExport uiExport = event.getSource() ; List<UICheckBoxInput> listCheckbox = new ArrayList<UICheckBoxInput>(); uiExport.findComponentOfType(listCheckbox, UICheckBoxInput.class); for(int i = 0; i < listCheckbox.size(); i ++) { listCheckbox.get(i).setChecked(true) ; } uiExport.setActions(new String[] {"Export", "Cancel", "UncheckAll"}) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiExport.getParent()) ; } } }