/* * 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.tree.selectone; import java.util.ArrayList; import java.util.List; import javax.jcr.AccessDeniedException; import javax.jcr.Node; import javax.jcr.RepositoryException; import javax.jcr.Session; import org.exoplatform.ecm.webui.form.UIFormInputSetWithAction; import org.exoplatform.ecm.webui.selector.UISelectable; import org.exoplatform.ecm.webui.tree.UINodeTreeBuilder; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.core.ManageableRepository; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.services.wcm.utils.WCMCoreUtils; 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.UIBreadcumbs; 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.EventListener; import org.exoplatform.webui.form.UIForm; import org.exoplatform.webui.form.UIFormInputInfo; import org.exoplatform.webui.form.UIFormSelectBox; /** * Created by The eXo Platform SARL * Author : Dang Van Minh * minh.dang@exoplatform.com * Jun 21, 2007 2:32:49 PM */ @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "classpath:groovy/ecm/webui/form/UIFormWithoutAction.gtmpl", events = { @EventConfig(listeners = UIWorkspaceList.ChangeWorkspaceActionListener.class), @EventConfig(listeners = UIWorkspaceList.AddRootNodeActionListener.class) } ) public class UIWorkspaceList extends UIForm { static private String WORKSPACE_NAME = "workspaceName"; static private String ROOT_NODE_INFO = "rootNodeInfo"; static private String ROOT_NODE_PATH = "rootNodePath"; private List<String> wsList_; private boolean isShowSystem_ = true; private static final Log LOG = ExoLogger.getLogger(UIWorkspaceList.class.getName()); public UIWorkspaceList() throws Exception { List<SelectItemOption<String>> wsList = new ArrayList<SelectItemOption<String>>(); UIFormSelectBox uiWorkspaceList = new UIFormSelectBox(WORKSPACE_NAME, WORKSPACE_NAME, wsList); uiWorkspaceList.setOnChange("ChangeWorkspace"); addUIFormInput(uiWorkspaceList); UIFormInputSetWithAction rootNodeInfo = new UIFormInputSetWithAction(ROOT_NODE_INFO); rootNodeInfo.addUIFormInput(new UIFormInputInfo(ROOT_NODE_PATH, ROOT_NODE_PATH, null)); String[] actionInfor = {"AddRootNode"}; rootNodeInfo.setActionInfo(ROOT_NODE_PATH, actionInfor); rootNodeInfo.showActionInfo(true); rootNodeInfo.setRendered(false); addUIComponentInput(rootNodeInfo); } public void setIsShowSystem(boolean isShowSystem) { isShowSystem_ = isShowSystem; } public boolean isShowSystemWorkspace() { return isShowSystem_; } public void setShowRootPathSelect(boolean isRender) { UIFormInputSetWithAction uiInputAction = getChildById(ROOT_NODE_INFO); uiInputAction.setRendered(isRender); } public void setWorkspaceList() throws Exception { wsList_ = new ArrayList<String>(); RepositoryService repositoryService = getApplicationComponent(RepositoryService.class); String[] wsNames = repositoryService.getCurrentRepository().getWorkspaceNames(); String systemWsName = repositoryService.getCurrentRepository() .getConfiguration() .getSystemWorkspaceName(); List<SelectItemOption<String>> workspace = new ArrayList<SelectItemOption<String>>(); for (String wsName : wsNames) { Node rootNode = null; try { rootNode = getRootNode(wsName); } catch(AccessDeniedException ex) { continue; } catch(RepositoryException ex) { continue; } if (!isShowSystem_) { if (!wsName.equals(systemWsName)) { workspace.add(new SelectItemOption<String>(wsName, wsName)); wsList_.add(wsName); } } else { workspace.add(new SelectItemOption<String>(wsName, wsName)); wsList_.add(wsName); } } UIFormSelectBox uiWorkspaceList = getUIFormSelectBox(WORKSPACE_NAME); uiWorkspaceList.setOptions(workspace); UIOneNodePathSelector uiBrowser = getParent(); if (uiBrowser.getWorkspaceName() != null) { if (wsList_.contains(uiBrowser.getWorkspaceName())) { uiWorkspaceList.setValue(uiBrowser.getWorkspaceName()); } } } public void setIsDisable(String wsName, boolean isDisable) { if(wsList_.contains(wsName)) getUIFormSelectBox(WORKSPACE_NAME).setValue(wsName); getUIFormSelectBox(WORKSPACE_NAME).setDisabled(isDisable); } private Node getRootNode(String workspaceName) throws RepositoryException { RepositoryService repositoryService = getApplicationComponent(RepositoryService.class); ManageableRepository manageableRepository = repositoryService.getCurrentRepository(); return WCMCoreUtils.getUserSessionProvider().getSession(workspaceName, manageableRepository).getRootNode(); } static public class ChangeWorkspaceActionListener extends EventListener<UIWorkspaceList> { public void execute(Event<UIWorkspaceList> event) throws Exception { UIWorkspaceList uiWorkspaceList = event.getSource(); UIOneNodePathSelector uiJBrowser = uiWorkspaceList.getParent(); String wsName = uiWorkspaceList.getUIFormSelectBox(WORKSPACE_NAME).getValue(); uiJBrowser.setWorkspaceName(wsName); UINodeTreeBuilder uiTreeBuilder = uiJBrowser.getChild(UINodeTreeBuilder.class); UIBreadcumbs uiBreadcumbs = uiJBrowser.getChild(UIBreadcumbs.class); if (uiBreadcumbs != null) uiBreadcumbs.getPath().clear(); UIApplication uiApp = uiWorkspaceList.getAncestorOfType(UIApplication.class); try { uiTreeBuilder.setRootTreeNode(uiWorkspaceList.getRootNode(wsName)); } catch(Exception e) { if (LOG.isErrorEnabled()) { LOG.error("An unexpected error occurs", e); } return; } uiTreeBuilder.buildTree(); event.getRequestContext().addUIComponentToUpdateByAjax(uiJBrowser); } } static public class AddRootNodeActionListener extends EventListener<UIWorkspaceList> { public void execute(Event<UIWorkspaceList> event) throws Exception { UIWorkspaceList uiWorkspaceList = event.getSource(); UIOneNodePathSelector uiJBrowser = uiWorkspaceList.getParent(); String returnField = uiJBrowser.getReturnFieldName(); String workspaceName = uiJBrowser.getWorkspaceName(); RepositoryService repositoryService = uiWorkspaceList.getApplicationComponent(RepositoryService.class); ManageableRepository manageableRepository = repositoryService.getCurrentRepository(); Session session = WCMCoreUtils.getSystemSessionProvider().getSession(workspaceName, manageableRepository); String value = session.getRootNode().getPath(); if (!uiJBrowser.isDisable()) { StringBuffer sb = new StringBuffer(); sb.append(uiJBrowser.getWorkspaceName()).append(":").append(value); value = sb.toString(); } ((UISelectable)uiJBrowser.getSourceComponent()).doSelect(returnField, value); } } }