/* * 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 javax.jcr.NamespaceException; import javax.jcr.RepositoryException; import javax.jcr.nodetype.NoSuchNodeTypeException; import javax.jcr.nodetype.NodeType; import javax.jcr.nodetype.NodeTypeManager; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.core.nodetype.ExtendedNodeTypeManager; import org.exoplatform.services.jcr.core.nodetype.NodeTypeValue; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.web.application.ApplicationMessage; 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:02:38 PM */ @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "classpath:groovy/ecm/webui/form/UIForm.gtmpl", events = { @EventConfig(listeners = UINodeTypeImport.ImportActionListener.class), @EventConfig(phase=Phase.DECODE, listeners = UINodeTypeImport.UploadActionListener.class), @EventConfig(phase=Phase.DECODE, listeners = UINodeTypeImport.CancelActionListener.class) } ) public class UINodeTypeImport extends UIForm { private List<NodeTypeValue> nodeTypeList_ = new ArrayList<NodeTypeValue>() ; final static String TABLE_NAME = "uiTableInputSetName"; final static String [] TABLE_COLUMNS = {"label", "input"}; private static final Log LOG = ExoLogger.getLogger(UINodeTypeImport.class.getName()); private List<String> undefinedNodeType = new ArrayList<String>(); private List<String> registeredNodeType = new ArrayList<String>(); private List<String> undefinedNamespace = new ArrayList<String>(); public List<String> getUndefinedNamespace() { return undefinedNamespace; } public void setUndefinedNamespace(List<String> undefinedNamespace) { this.undefinedNamespace = undefinedNamespace; } public List<String> getUndefinedNodeTypes() { return undefinedNodeType; } public void setUndefinedNodeType(List<String> undefinedNodeType) { this.undefinedNodeType = undefinedNodeType; } public UINodeTypeImport() throws Exception { } public void update(ArrayList<NodeTypeValue> nodeTypeList) throws Exception { UIFormTableInputSet uiTableInputSet = getChild(UIFormTableInputSet.class) ; if(uiTableInputSet == null ) { uiTableInputSet = createUIComponent(UIFormTableInputSet.class, null, "uiTableInputSetID") ; addUIComponentInput(uiTableInputSet) ; } else { uiTableInputSet.getChildren().clear() ; } NodeTypeManager ntManager = getApplicationComponent(RepositoryService.class). getCurrentRepository().getNodeTypeManager() ; UIFormInputSet uiInputSet ; uiTableInputSet.setName(TABLE_NAME); uiTableInputSet.setColumns(TABLE_COLUMNS); getUndefinedNodeTypes().clear(); getUndefinedNamespace().clear(); getRegisteredNodeType().clear(); nodeTypeList_ = nodeTypeList ; UIFormInputInfo uiInfo; String nodeTypeName; NodeTypeValue nodeTypeValue; UICheckBoxInput checkbox; NodeType register = null; for(int i = 0 ; i < nodeTypeList_.size() ; i ++) { nodeTypeValue = (NodeTypeValue)nodeTypeList_.get(i) ; nodeTypeName = nodeTypeValue.getName() ; uiInputSet = new UIFormInputSet(nodeTypeName) ; uiInfo = new UIFormInputInfo("label", null, nodeTypeName); uiInputSet.addChild(uiInfo); checkbox = new UICheckBoxInput(nodeTypeName, nodeTypeName, null) ; try { register = ntManager.getNodeType(nodeTypeName) ; uiInputSet.addChild(checkbox); uiTableInputSet.addChild(uiInputSet); if(register != null) { getRegisteredNodeType().add(nodeTypeName); checkbox.setDisabled(true); } } catch (NamespaceException e) { if (nodeTypeName != null && nodeTypeName.contains(":")) { getUndefinedNamespace().add( nodeTypeName.substring(0, nodeTypeName.indexOf(":"))); } } catch (NoSuchNodeTypeException e) { getUndefinedNodeTypes().add(nodeTypeName); uiInputSet.addChild(checkbox); uiTableInputSet.addChild(uiInputSet); checkbox.setDisabled(false); } catch (RepositoryException e) { if (NamespaceException.class.isInstance(e.getCause())) { if (nodeTypeName != null && nodeTypeName.contains(":")) { getUndefinedNamespace().add( nodeTypeName.substring(0, nodeTypeName.indexOf(":"))); } } else { throw e; } } } } public String getLabel(String id) { return "label" + id ; } public void setRegisteredNodeType(List<String> registeredNodeType) { this.registeredNodeType = registeredNodeType; } public List<String> getRegisteredNodeType() { return registeredNodeType; } static public class CancelActionListener extends EventListener<UINodeTypeImport> { public void execute(Event<UINodeTypeImport> event) throws Exception { UINodeTypeImport uiImport = event.getSource() ; UINodeTypeImportPopup uiImportPopup = uiImport.getParent() ; uiImportPopup.setRenderedChild(UINodeTypeUpload.class) ; UIPopupWindow uiPopup = uiImportPopup.getParent() ; uiPopup.setRendered(false) ; } } static public class UploadActionListener extends EventListener<UINodeTypeImport> { public void execute(Event<UINodeTypeImport> event) throws Exception { UINodeTypeImport uiImport = event.getSource() ; UINodeTypeManager uiManager = uiImport.getAncestorOfType(UINodeTypeManager.class) ; UIPopupWindow uiPopup = uiManager.findComponentById(UINodeTypeManager.IMPORT_POPUP) ; UINodeTypeImportPopup uiImportPopup = uiImport.getParent() ; uiImportPopup.setRenderedChild(UINodeTypeUpload.class) ; uiPopup.setShow(true) ; } } static public class ImportActionListener extends EventListener<UINodeTypeImport> { public void execute(Event<UINodeTypeImport> event) throws Exception { UINodeTypeImport uiImport = event.getSource() ; RepositoryService repositoryService = uiImport.getApplicationComponent(RepositoryService.class) ; NodeTypeManager ntManager = repositoryService.getCurrentRepository().getNodeTypeManager() ; UINodeTypeManager uiManager = uiImport.getAncestorOfType(UINodeTypeManager.class) ; UINodeTypeImportPopup uiImportPopup = uiImport.getParent() ; uiImportPopup.setRenderedChild(UINodeTypeUpload.class) ; UIApplication uiApp = uiImport.getAncestorOfType(UIApplication.class) ; ExtendedNodeTypeManager extManager = (ExtendedNodeTypeManager) ntManager ; int counter = 0 ; List<UICheckBoxInput> listCheckbox = new ArrayList<UICheckBoxInput>(); uiImport.findComponentOfType(listCheckbox, UICheckBoxInput.class); for(int i = 0 ; i < uiImport.nodeTypeList_.size() ; i ++){ NodeTypeValue nodeTypeValue = (NodeTypeValue)uiImport.nodeTypeList_.get(i) ; if(listCheckbox.get(i).isChecked()) { try { extManager.registerNodeType(nodeTypeValue, ExtendedNodeTypeManager.IGNORE_IF_EXISTS) ; counter += 1 ; } catch(RepositoryException re) { if (LOG.isErrorEnabled()) { LOG.error("Cannot register nodetype " + nodeTypeValue + " cause by: " + re.getMessage()); } } } } if(counter > 0) { String[] count = {String.valueOf(counter)} ; UINodeTypeList uiNodeTypeList = uiManager.getChild(UINodeTypeList.class) ; uiNodeTypeList.refresh(uiNodeTypeList.getUIPageIterator().getCurrentPage()); UIPopupWindow uiPopup = uiManager.findComponentById(UINodeTypeManager.IMPORT_POPUP) ; uiPopup.setRendered(false) ; uiApp.addMessage(new ApplicationMessage("UINodeTypeImport.msg.nodetype-registered", count)) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; return ; } uiApp.addMessage(new ApplicationMessage("UINodeTypeImport.msg.no-nodetype-registered", null)) ; } } }