/* * 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.Collections; import java.util.Comparator; import java.util.List; import javax.jcr.Node; import javax.jcr.NodeIterator; import javax.jcr.Session; import javax.jcr.nodetype.NodeType; import javax.jcr.nodetype.NodeTypeIterator; import javax.jcr.nodetype.NodeTypeManager; import org.exoplatform.commons.utils.LazyPageList; import org.exoplatform.commons.utils.ListAccess; import org.exoplatform.commons.utils.ListAccessImpl; import org.exoplatform.ecm.webui.core.UIPagingGridDecorator; import org.exoplatform.ecm.webui.form.UIFormInputSetWithAction; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.core.ManageableRepository; import org.exoplatform.services.wcm.core.NodeLocation; import org.exoplatform.webui.config.annotation.ComponentConfig; import org.exoplatform.webui.config.annotation.EventConfig; import org.exoplatform.webui.core.UIComponent; import org.exoplatform.webui.event.Event; import org.exoplatform.webui.event.EventListener; import org.exoplatform.webui.form.UIFormInputInfo; /** * Created by The eXo Platform SARL * Author : Dang Van Minh * minh.dang@exoplatform.com * Sep 20, 2006 * 3:28:26 PM */ @ComponentConfig( template = "app:/groovy/webui/component/admin/nodetype/UINodeTypeList.gtmpl", events = { @EventConfig(listeners = UINodeTypeList.ViewActionListener.class), @EventConfig(listeners = UINodeTypeList.EditActionListener.class), @EventConfig(listeners = UINodeTypeList.DeleteActionListener.class, confirm="UINodeTypeList.msg.confirm-delete"), @EventConfig(listeners = UINodeTypeList.AddActionListener.class), @EventConfig(listeners = UINodeTypeList.ImportActionListener.class), @EventConfig(listeners = UINodeTypeList.ExportActionListener.class) } ) public class UINodeTypeList extends UIPagingGridDecorator { final static public String DRAFTNODETYPE = "jcr:system/jcr:nodetypesDraft" ; final static public String[] ACTIONS = {"Add", "Import", "Export"} ; final static public String[] CANCEL = {"Cancel"} ; final static public String[] TAB_REMOVE = { UINodeTypeForm.SUPER_TYPE_TAB, UINodeTypeForm.DEFAULT_PRIMARY_TYPE_TAB, UINodeTypeForm.REQUIRED_PRIMARY_TYPE_TAB} ; public UINodeTypeList() throws Exception { getUIPageIterator().setId("UINodeTypeListIterator") ; } @SuppressWarnings("unchecked") public List getAllNodeTypes() throws Exception{ List nodeList = new ArrayList<NodeTypeBean>(); ManageableRepository mRepository = getApplicationComponent(RepositoryService.class).getCurrentRepository() ; NodeTypeManager ntManager = mRepository.getNodeTypeManager() ; NodeTypeIterator nodeTypeIter = ntManager.getAllNodeTypes() ; while(nodeTypeIter.hasNext()) { nodeList.add(new NodeTypeBean(nodeTypeIter.nextNodeType())) ; } Collections.sort(nodeList, new NodeTypeNameComparator()) ; Session session = mRepository.getSystemSession(mRepository.getConfiguration().getSystemWorkspaceName()) ; if(session.getRootNode().hasNode(DRAFTNODETYPE)) { Node draftNode = session.getRootNode().getNode(DRAFTNODETYPE) ; NodeIterator nodeIter = draftNode.getNodes() ; while(nodeIter.hasNext()) { nodeList.add(nodeIter.nextNode()) ; } } session.logout() ; return nodeList ; } public List getNodeTypeList() throws Exception { return NodeLocation.getNodeListByLocationList(getUIPageIterator().getCurrentPageData()); } public String[] getActions() { return ACTIONS ; } public void refresh(String name, int currentPage, List<NodeTypeBean> nodeType) throws Exception { ListAccess<Object> nodeTypeList = new ListAccessImpl<Object>(Object.class, NodeLocation.getLocationsByNodeList(nodeType)); LazyPageList<Object> pageList = new LazyPageList<Object>(nodeTypeList, getUIPageIterator().getItemsPerPage()); getUIPageIterator().setPageList(pageList); if (currentPage > getUIPageIterator().getAvailablePage()) getUIPageIterator().setCurrentPage(getUIPageIterator().getAvailablePage()); else getUIPageIterator().setCurrentPage(currentPage); } public void refresh(String name, int currentPage) throws Exception { ManageableRepository manaRepository = getApplicationComponent(RepositoryService.class).getCurrentRepository() ; Session session = manaRepository.getSystemSession(manaRepository.getConfiguration().getSystemWorkspaceName()) ; if(name != null) { if(session.getRootNode().hasNode(DRAFTNODETYPE)) { Node draftNode = session.getRootNode().getNode(DRAFTNODETYPE) ; if(draftNode.hasNode(name)) { Node deleteNode = draftNode.getNode(name) ; deleteNode.remove() ; draftNode.save() ; } if(!draftNode.hasNodes())draftNode.remove() ; session.save() ; } } else { session.refresh(true) ; } session.logout(); refresh(name, currentPage, getAllNodeTypes()); } static public class AddActionListener extends EventListener<UINodeTypeList> { public void execute(Event<UINodeTypeList> event) throws Exception { UINodeTypeList uiList = event.getSource() ; UINodeTypeManager uiManager = uiList.getParent() ; uiManager.initPopup(false) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; } } static public class ImportActionListener extends EventListener<UINodeTypeList> { public void execute(Event<UINodeTypeList> event) throws Exception { UINodeTypeList uiList = event.getSource() ; UINodeTypeManager uiManager = uiList.getParent() ; uiManager.setImportPopup() ; event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; } } static public class ExportActionListener extends EventListener<UINodeTypeList> { public void execute(Event<UINodeTypeList> event) throws Exception { UINodeTypeList uiList = event.getSource() ; UINodeTypeManager uiManager = uiList.getParent() ; uiManager.setExportPopup() ; event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; } } static public class ViewActionListener extends EventListener<UINodeTypeList> { public void execute(Event<UINodeTypeList> event) throws Exception { UINodeTypeList uiList = event.getSource() ; String ntName = event.getRequestContext().getRequestParameter(OBJECTID) ; ManageableRepository manaRepository = uiList.getApplicationComponent(RepositoryService.class).getCurrentRepository() ; Session session = manaRepository.getSystemSession(manaRepository.getConfiguration().getSystemWorkspaceName()) ; NodeTypeManager ntManager = session.getWorkspace().getNodeTypeManager() ; NodeType nodeType = ntManager.getNodeType(ntName) ; UINodeTypeManager uiManager = uiList.getParent() ; uiManager.initPopup(true) ; UINodeTypeForm uiForm = uiManager.findFirstComponentOfType(UINodeTypeForm.class) ; uiForm.update(nodeType, true) ; for(UIComponent uiComp : uiForm.getChildren()) { UIFormInputSetWithAction tab = uiForm.getChildById(uiComp.getId()) ; for(UIComponent uiChild : tab.getChildren()) { if(!(uiChild instanceof UIFormInputInfo)) tab.setActionInfo(uiChild.getName(), null) ; } if(tab.getId().equals(UINodeTypeForm.NODETYPE_DEFINITION)) { tab.setRendered(true) ; tab.setActions(new String[] {"Close"}, null) ; } else { tab.setRendered(true) ; tab.setActions(null, null) ; } } uiForm.removeChildTabs(TAB_REMOVE) ; event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; } } static public class EditActionListener extends EventListener<UINodeTypeList> { public void execute(Event<UINodeTypeList> event) throws Exception { UINodeTypeList uiNodeList = event.getSource() ; ManageableRepository manaRepository = uiNodeList.getApplicationComponent(RepositoryService.class).getCurrentRepository() ; Session session = manaRepository.getSystemSession(manaRepository.getConfiguration().getSystemWorkspaceName()) ; String nodeName = event.getRequestContext().getRequestParameter(OBJECTID) ; Node draftNodeType = session.getRootNode().getNode(DRAFTNODETYPE + "/" + nodeName) ; UINodeTypeManager uiManager = uiNodeList.getParent() ; uiManager.initPopup(false) ; UINodeTypeForm uiForm = uiManager.findFirstComponentOfType(UINodeTypeForm.class) ; uiForm.refresh() ; uiForm.removeChildTabs(TAB_REMOVE) ; uiForm.updateEdit(draftNodeType, true) ; UIFormInputSetWithAction tab = uiForm.getChildById(UINodeTypeForm.NODETYPE_DEFINITION) ; String[] actionNames = {UINodeTypeForm.ACTION_SAVE, UINodeTypeForm.ACTION_SAVEDRAFT, UINodeTypeForm.ACTION_CANCEL} ; tab.setActions(actionNames, null) ; tab.setIsView(false) ; uiForm.setTabRender(UINodeTypeForm.NODETYPE_DEFINITION) ; session.logout() ; event.getRequestContext().addUIComponentToUpdateByAjax(uiManager) ; } } static public class DeleteActionListener extends EventListener<UINodeTypeList> { public void execute(Event<UINodeTypeList> event) throws Exception { UINodeTypeList uiNodeList = event.getSource() ; ManageableRepository manaRepository = uiNodeList.getApplicationComponent(RepositoryService.class).getCurrentRepository(); Session session = manaRepository.getSystemSession(manaRepository.getConfiguration().getSystemWorkspaceName()) ; String nodeName = event.getRequestContext().getRequestParameter(OBJECTID) ; if(session.getRootNode().hasNode(DRAFTNODETYPE)) { Node draftNode = session.getRootNode().getNode(DRAFTNODETYPE) ; Node deleteNode = draftNode.getNode(nodeName) ; deleteNode.remove() ; draftNode.save() ; if(!draftNode.hasNodes()) draftNode.remove() ; session.save() ; uiNodeList.refresh(null, uiNodeList.getUIPageIterator().getCurrentPage()); event.getRequestContext().addUIComponentToUpdateByAjax(uiNodeList.getParent()) ; } session.logout() ; } } public static class NodeTypeBean { private String nodeTypeName_; private boolean isMixin_; private boolean hasOrderableChildNodes_; public NodeTypeBean(NodeType nodeType) { this.nodeTypeName_ = nodeType.getName(); this.isMixin_ = nodeType.isMixin(); this.hasOrderableChildNodes_ = nodeType.hasOrderableChildNodes(); } public String getName() { return nodeTypeName_; } public void setName(String nodeTypeName) { nodeTypeName_ = nodeTypeName; } public boolean isMixin() { return isMixin_; } public void setMixin(boolean isMixin) { isMixin_ = isMixin; } public boolean hasOrderableChildNodes() { return hasOrderableChildNodes_; } public void setOrderableChildNodes(boolean value) { hasOrderableChildNodes_ = value; } } static public class NodeTypeNameComparator implements Comparator<NodeTypeBean> { public int compare(NodeTypeBean n1, NodeTypeBean n2) throws ClassCastException { String name1 = n1.getName(); String name2 = n2.getName(); return name1.compareToIgnoreCase(name2); } } public void refresh(int currentPage) throws Exception { refresh(null, currentPage); } }