/* * 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.drives; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.MissingResourceException; import java.util.ResourceBundle; import java.util.Set; import javax.jcr.Session; import org.exoplatform.ecm.webui.selector.UISelectable; import org.exoplatform.ecm.webui.utils.Utils; import org.exoplatform.portal.webui.util.Util; import org.exoplatform.services.cms.drives.DriveData; import org.exoplatform.services.cms.drives.ManageDriveService; import org.exoplatform.services.cms.templates.TemplateService; import org.exoplatform.services.jcr.RepositoryService; import org.exoplatform.services.jcr.config.WorkspaceEntry; import org.exoplatform.services.jcr.impl.core.WorkspaceInitializer; import org.exoplatform.web.application.ApplicationMessage; import org.exoplatform.web.application.RequestContext; import org.exoplatform.webui.application.WebuiRequestContext; 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.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.UIFormInputSet; import org.exoplatform.webui.form.UIFormSelectBox; import org.exoplatform.webui.form.UIFormStringInput; import org.exoplatform.webui.form.UIFormTabPane; /** * Created by The eXo Platform SARL * Author : Tran The Trong * trongtt@exoplatform.com * Sep 19, 2006 * 5:31:04 PM */ @ComponentConfig( lifecycle = UIFormLifecycle.class, template = "system:/groovy/webui/form/UIFormTabPane.gtmpl", events = { @EventConfig(listeners = UIDriveForm.SaveActionListener.class), @EventConfig(listeners = UIDriveForm.RefreshActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIDriveForm.CancelActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIDriveForm.AddPermissionActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIDriveForm.RemovePermissionActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIDriveForm.AddPathActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIDriveForm.AddIconActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIDriveForm.ChangeActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIDriveForm.ChooseNodeTypeActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIDriveForm.RemoveNodeTypeActionListener.class, phase = Phase.DECODE), @EventConfig(listeners = UIDriveForm.SelectTabActionListener.class, phase = Phase.DECODE) } ) public class UIDriveForm extends UIFormTabPane implements UISelectable { private boolean isAddNew_ = true; final static public String[] ACTIONS = {"Save", "Refresh", "Cancel"}; final static public String POPUP_DRIVEPERMISSION = "PopupDrivePermission"; final static public String POPUP_NODETYPE_SELECTOR = "PopupNodeTypeSelector"; private String membershipString = ""; private String nodeTypes = ""; final static public String ANY_PERMISSION = "*"; public UIDriveForm() throws Exception { super("UIDriveForm"); UIFormInputSet driveInputSet = new UIDriveInputSet("DriveInputSet"); UIFormSelectBox selectBox = driveInputSet.getChildById(UIDriveInputSet.FIELD_WORKSPACE); selectBox.setOnChange("Change"); addUIFormInput(driveInputSet); setSelectedTab(driveInputSet.getId()); UIFormInputSet viewInputSet = new UIViewsInputSet("ViewsInputSet"); addUIFormInput(viewInputSet); setActions(ACTIONS); } public String getLabel(ResourceBundle res, String id) { try { return res.getString("UIDriveForm.label." + id); } catch (MissingResourceException ex) { return id + " "; } } public void doSelect(String selectField, Object value) { UIFormStringInput uiStringInput = getUIStringInput(selectField); if (selectField.equals(UIDriveInputSet.FIELD_PERMISSION)){ String membership = value.toString(); String valuePermissions = uiStringInput.getValue(); List<String> permissionsList = new ArrayList<String>(); StringBuilder newsPermissions = new StringBuilder(); if(valuePermissions != null) { String[] permissionsArray = valuePermissions.split(","); permissionsList = Arrays.asList(permissionsArray); if (permissionsList.size() > 0) { for (String permission : permissionsList) { if(newsPermissions.length() > 0) newsPermissions.append(","); newsPermissions.append(permission.trim()); } } if(!permissionsList.contains(membership)) { if(newsPermissions.length() > 0) { newsPermissions.append(",").append(membership.trim()); } else { newsPermissions.append(membership.trim()); } } uiStringInput.setValue(newsPermissions.toString()); } else uiStringInput.setValue(value.toString()); } else if (selectField.equals(UIDriveInputSet.FIELD_HOMEPATH)){ uiStringInput.setValue(value.toString()); UIDriveInputSet driveInputSet = getChild(UIDriveInputSet.class); if (driveInputSet!=null) driveInputSet.updateFolderAllowed(value.toString()); } else { uiStringInput.setValue(value.toString()); } UIDriveManager uiContainer = getAncestorOfType(UIDriveManager.class) ; for(UIComponent uiChild : uiContainer.getChildren()) { if(uiChild.getId().equals(POPUP_DRIVEPERMISSION) || uiChild.getId().equals("JCRBrowser") || uiChild.getId().equals("JCRBrowserAssets") || uiChild.getId().equals(POPUP_NODETYPE_SELECTOR)) { UIPopupWindow uiPopup = uiContainer.getChildById(uiChild.getId()) ; uiPopup.setRendered(false) ; } } } public void refresh(String driveName) throws Exception { DriveData drive = null; if(driveName == null) { isAddNew_ = true; } else { isAddNew_ = false; setActions(new String[] {"Save", "Cancel"}); drive = getApplicationComponent(ManageDriveService.class).getDriveByName(driveName); } getChild(UIDriveInputSet.class).update(drive); getChild(UIViewsInputSet.class).update(drive); } public String getWorkspaceEntries(String selectedWorkspace) throws Exception { RepositoryService repositoryService = getApplicationComponent(RepositoryService.class); List<WorkspaceEntry> wsEntries = repositoryService.getCurrentRepository() .getConfiguration() .getWorkspaceEntries(); String wsInitRootNodeType = null; for(WorkspaceEntry wsEntry : wsEntries) { if(wsEntry.getName().equals(selectedWorkspace)) { wsInitRootNodeType = wsEntry.getInitializer().getParameterValue(WorkspaceInitializer.ROOT_NODETYPE_PARAMETER); break; } } return wsInitRootNodeType; } /* (non-Javadoc) * @see org.exoplatform.webui.form.UIForm#processRender(org.exoplatform.webui.application.WebuiRequestContext) */ @Override public void processRender(WebuiRequestContext context) throws Exception { context.getJavascriptManager().require("SHARED/jquery", "gj") .addScripts("gj(document).ready(function() { gj(\"*[rel='tooltip']\").tooltip();});"); super.processRender(context); } static public class SaveActionListener extends EventListener<UIDriveForm> { public void execute(Event<UIDriveForm> event) throws Exception { UIDriveForm uiDriveForm = event.getSource(); ManageDriveService dservice_ = uiDriveForm.getApplicationComponent(ManageDriveService.class); RepositoryService rservice = uiDriveForm.getApplicationComponent(RepositoryService.class); UIDriveInputSet driveInputSet = uiDriveForm.getChild(UIDriveInputSet.class); UIApplication uiApp = uiDriveForm.getAncestorOfType(UIApplication.class); String name = driveInputSet.getUIStringInput(UIDriveInputSet.FIELD_NAME).getValue().trim(); String workspace = driveInputSet.getUIFormSelectBox(UIDriveInputSet.FIELD_WORKSPACE).getValue(); String path = driveInputSet.getUIStringInput(UIDriveInputSet.FIELD_HOMEPATH).getValue(); if((path == null)||(path.trim().length() == 0)) path = "/"; // Only check path if Drive is not virtual drive if (!dservice_.isVitualDrive(name)) { Session session = null; try { session = rservice.getCurrentRepository().getSystemSession(workspace); String userId = Util.getPortalRequestContext().getRemoteUser(); String pathReal = org.exoplatform.services.cms.impl.Utils.getPersonalDrivePath(path, userId); session.getItem(pathReal); session.logout(); } catch(Exception e) { if(session!=null) { session.logout(); } uiApp.addMessage(new ApplicationMessage("UIDriveForm.msg.workspace-path-invalid", null, ApplicationMessage.WARNING)); return; } } boolean viewReferences = driveInputSet.getUICheckBoxInput(UIDriveInputSet.FIELD_VIEWPREFERENCESDOC).isChecked(); boolean viewSideBar = driveInputSet.getUICheckBoxInput(UIDriveInputSet.FIELD_VIEWSIDEBAR).isChecked(); boolean showHiddenNode = driveInputSet.getUICheckBoxInput(UIDriveInputSet.SHOW_HIDDEN_NODE).isChecked(); boolean viewNonDocument = driveInputSet.getUICheckBoxInput(UIDriveInputSet.FIELD_VIEWNONDOC).isChecked(); String[] allowCreateFolders = driveInputSet.getUIFormSelectBox(UIDriveInputSet.FIELD_ALLOW_CREATE_FOLDERS) .getSelectedValues(); if (allowCreateFolders == null || allowCreateFolders.length == 0 ) { allowCreateFolders = new String[] {}; } StringBuilder foldertypes = new StringBuilder(""); for (String allowCreateFolder : allowCreateFolders) { foldertypes.append(allowCreateFolder).append(","); } if (foldertypes.toString().endsWith(",")) foldertypes.deleteCharAt(foldertypes.length() -1 ); UIViewsInputSet viewsInputSet = uiDriveForm.getChild(UIViewsInputSet.class); String views = viewsInputSet.getViewsSelected(); String permissions = driveInputSet.getUIStringInput(UIDriveInputSet.FIELD_PERMISSION).getValue(); if (permissions.subSequence(permissions.length() - 1, permissions.length()).equals(",")) permissions = permissions.substring(0, permissions.length() - 1); String[] arrPermissions = permissions.split(","); for (String itemPermission : arrPermissions) { if (itemPermission != null && itemPermission.trim().equals("*")) { permissions = "*"; break; } } if(uiDriveForm.isAddNew_ && (dservice_.getDriveByName(name) != null)) { uiApp.addMessage(new ApplicationMessage("UIDriveForm.msg.drive-exists", null, ApplicationMessage.WARNING)); return; } String iconPath = driveInputSet.getUIStringInput(UIDriveInputSet.FIELD_WORKSPACEICON).getValue(); if(iconPath != null && iconPath.trim().length() > 0) { Session jcrSession = null; try { if(iconPath.indexOf(":/") > -1) { String[] paths = iconPath.split(":/"); jcrSession = rservice.getCurrentRepository().getSystemSession(paths[0]); jcrSession.getItem("/" + paths[1]); jcrSession.logout(); } } catch(Exception e) { if(jcrSession != null) { jcrSession.logout(); } uiApp.addMessage(new ApplicationMessage("UIDriveForm.msg.icon-not-found", null, ApplicationMessage.WARNING)); return; } } else { iconPath = ""; } String allowNodeTypesOnTree = driveInputSet.getUIStringInput(UIDriveInputSet.FIELD_ALLOW_NODETYPES_ON_TREE).getValue(); if ((allowNodeTypesOnTree==null) || (allowNodeTypesOnTree.length()==0)) allowNodeTypesOnTree = "*"; dservice_.addDrive(name, workspace, permissions, path, views, iconPath, viewReferences, viewNonDocument, viewSideBar, showHiddenNode, foldertypes.toString(), allowNodeTypesOnTree); UIDriveManager uiManager = uiDriveForm.getAncestorOfType(UIDriveManager.class); UIDriveList uiDriveList = uiManager.getChild(UIDriveList.class); uiDriveList.refresh(uiDriveList.getUIPageIterator().getCurrentPage()); uiDriveForm.refresh(null); UIDriveManager uiDriveManager = uiDriveForm.getAncestorOfType(UIDriveManager.class); uiDriveManager.removeChildById(UIDriveForm.POPUP_DRIVEPERMISSION); UIPopupWindow uiPopup = uiDriveManager.getChildById(UIDriveList.ST_ADD); if(uiPopup != null) { uiPopup.setShow(false); uiPopup.setRendered(false); } UIPopupWindow uiEditPopup = uiDriveManager.getChildById(UIDriveList.ST_EDIT); if(uiEditPopup != null) { uiEditPopup.setShow(false); uiEditPopup.setRendered(false); } event.getRequestContext().addUIComponentToUpdateByAjax(uiDriveManager); } } static public class CancelActionListener extends EventListener<UIDriveForm> { public void execute(Event<UIDriveForm> event) throws Exception { UIDriveForm uiDriveForm = event.getSource(); uiDriveForm.refresh(null); UIDriveManager uiDriveManager = uiDriveForm.getAncestorOfType(UIDriveManager.class); uiDriveManager.removeChildById(UIDriveForm.POPUP_DRIVEPERMISSION); UIPopupWindow uiPopup = uiDriveManager.getChildById(UIDriveList.ST_ADD); if(uiPopup != null) { uiPopup.setShow(false); uiPopup.setRendered(false); } UIPopupWindow uiEditPopup = uiDriveManager.getChildById(UIDriveList.ST_EDIT); if(uiEditPopup != null) { uiEditPopup.setShow(false); uiEditPopup.setRendered(false); } event.getRequestContext().addUIComponentToUpdateByAjax(uiDriveManager); } } static public class RefreshActionListener extends EventListener<UIDriveForm> { public void execute(Event<UIDriveForm> event) throws Exception { event.getSource().refresh(null); event.getRequestContext().addUIComponentToUpdateByAjax(event.getSource()); } } static public class AddPermissionActionListener extends EventListener<UIDriveForm> { public void execute(Event<UIDriveForm> event) throws Exception { UIDriveForm uiDriveForm = event.getSource(); UIDriveManager uiManager = uiDriveForm.getAncestorOfType(UIDriveManager.class); String membership = uiDriveForm.getUIStringInput(UIDriveInputSet.FIELD_PERMISSION).getValue(); uiDriveForm.membershipString = membership; uiDriveForm.getUIStringInput(UIDriveInputSet.FIELD_PERMISSION).setValue(uiDriveForm.membershipString); uiManager.initPopupPermission(uiDriveForm.membershipString); event.getRequestContext().addUIComponentToUpdateByAjax(uiManager); } } static public class RemovePermissionActionListener extends EventListener<UIDriveForm> { public void execute(Event<UIDriveForm> event) throws Exception { UIDriveForm uiDriveForm = event.getSource(); uiDriveForm.membershipString = ""; uiDriveForm.getUIStringInput(UIDriveInputSet.FIELD_PERMISSION).setValue(null); event.getRequestContext().addUIComponentToUpdateByAjax(uiDriveForm); } } static public class AddPathActionListener extends EventListener<UIDriveForm> { public void execute(Event<UIDriveForm> event) throws Exception { UIDriveForm uiDriveForm = event.getSource(); UIDriveManager uiManager = uiDriveForm.getAncestorOfType(UIDriveManager.class); UIDriveInputSet driveInputSet = uiDriveForm.getChild(UIDriveInputSet.class); String workspace = driveInputSet.getUIFormSelectBox(UIDriveInputSet.FIELD_WORKSPACE).getValue(); uiManager.initPopupJCRBrowser(workspace, true); event.getRequestContext().addUIComponentToUpdateByAjax(uiManager); } } static public class AddIconActionListener extends EventListener<UIDriveForm> { public void execute(Event<UIDriveForm> event) throws Exception { UIDriveForm uiDriveForm = event.getSource(); UIDriveManager uiManager = uiDriveForm.getAncestorOfType(UIDriveManager.class); UIDriveInputSet driveInputSet = uiDriveForm.getChild(UIDriveInputSet.class); String workspace = driveInputSet.getUIFormSelectBox(UIDriveInputSet.FIELD_WORKSPACE).getValue(); uiManager.initPopupJCRBrowserAssets(workspace); event.getRequestContext().addUIComponentToUpdateByAjax(uiManager); } } static public class ChangeActionListener extends EventListener<UIDriveForm> { public void execute(Event<UIDriveForm> event) throws Exception { UIDriveForm uiDriveForm = event.getSource(); String driverName = uiDriveForm.getUIStringInput(UIDriveInputSet.FIELD_NAME).getValue(); String selectedWorkspace = uiDriveForm.getUIStringInput(UIDriveInputSet.FIELD_WORKSPACE).getValue(); UIDriveInputSet driveInputSet = uiDriveForm.getChild(UIDriveInputSet.class); UIDriveManager uiManager = uiDriveForm.getAncestorOfType(UIDriveManager.class); ManageDriveService manageDriveService = uiDriveForm.getApplicationComponent(ManageDriveService.class); RepositoryService repositoryService = uiDriveForm.getApplicationComponent(RepositoryService.class); List<WorkspaceEntry> wsEntries = repositoryService.getCurrentRepository().getConfiguration().getWorkspaceEntries(); String wsInitRootNodeType = null; for(WorkspaceEntry wsEntry : wsEntries) { if(wsEntry.getName().equals(selectedWorkspace)) { wsInitRootNodeType = wsEntry.getInitializer().getParameterValue(WorkspaceInitializer.ROOT_NODETYPE_PARAMETER); } } TemplateService templateService = uiDriveForm.getApplicationComponent(TemplateService.class); Set<String> setFoldertypes = templateService.getAllowanceFolderType(); List<SelectItemOption<String>> foldertypeOptions = new ArrayList<SelectItemOption<String>>(); RequestContext context = RequestContext.getCurrentInstance(); ResourceBundle res = context.getApplicationResourceBundle(); String label = null; for(String folderType : setFoldertypes) { try { label = res.getString(driveInputSet.getId() + ".label." + folderType.replace(":", "_")); } catch(MissingResourceException mi) { label = folderType; } foldertypeOptions.add(new SelectItemOption<String>(label, folderType)); } List<SelectItemOption<String>> folderOptions = new ArrayList<SelectItemOption<String>>(); UIFormSelectBox uiInput = driveInputSet.<UIFormSelectBox>getUIInput(UIDriveInputSet.FIELD_ALLOW_CREATE_FOLDERS); if(wsInitRootNodeType != null && wsInitRootNodeType.equals(Utils.NT_FOLDER)) { folderOptions.add(new SelectItemOption<String>(UIDriveInputSet.FIELD_FOLDER_ONLY, Utils.NT_FOLDER)); } else { folderOptions.addAll(foldertypeOptions); } uiInput.setOptions(folderOptions); if(!uiDriveForm.isAddNew_) { DriveData drive = manageDriveService.getDriveByName(driverName); String defaultPath = drive.getHomePath(); if(!drive.getWorkspace().equals(selectedWorkspace)) defaultPath = "/"; uiDriveForm.getUIStringInput(UIDriveInputSet.FIELD_HOMEPATH).setValue(defaultPath); } event.getRequestContext().addUIComponentToUpdateByAjax(uiManager); } } static public class ChooseNodeTypeActionListener extends EventListener<UIDriveForm> { public void execute(Event<UIDriveForm> event) throws Exception { UIDriveForm uiDriveForm = event.getSource(); UIDriveManager uiManager = uiDriveForm.getAncestorOfType(UIDriveManager.class); String nodeTypes = uiDriveForm.getUIStringInput(UIDriveInputSet.FIELD_ALLOW_NODETYPES_ON_TREE).getValue(); if (nodeTypes != null){ uiDriveForm.nodeTypes = nodeTypes; } else { uiDriveForm.nodeTypes = ""; } uiDriveForm.getUIStringInput( UIDriveInputSet.FIELD_ALLOW_NODETYPES_ON_TREE).setValue(uiDriveForm.nodeTypes); uiManager.initPopupNodeTypeSelector(uiDriveForm.nodeTypes); event.getRequestContext().addUIComponentToUpdateByAjax(uiManager); } } static public class RemoveNodeTypeActionListener extends EventListener<UIDriveForm> { public void execute(Event<UIDriveForm> event) throws Exception { UIDriveForm uiDriveForm = event.getSource(); uiDriveForm.nodeTypes = ""; uiDriveForm.getUIStringInput(UIDriveInputSet.FIELD_ALLOW_NODETYPES_ON_TREE).setValue(null); event.getRequestContext().addUIComponentToUpdateByAjax(uiDriveForm); } } static public class SelectTabActionListener extends EventListener<UIDriveForm> { public void execute(Event<UIDriveForm> event) throws Exception { WebuiRequestContext context = event.getRequestContext(); String renderTab = context.getRequestParameter(UIComponent.OBJECTID); if (renderTab == null) return; event.getSource().setSelectedTab(renderTab); event.getRequestContext().addUIComponentToUpdateByAjax(event.getSource()); } } }