/** * Copyright (c) 2000-present Liferay, Inc. All rights reserved. * * This library is free software; you can redistribute it and/or modify it under * the terms of the GNU Lesser General Public License as published by the Free * Software Foundation; either version 2.1 of the License, or (at your option) * any later version. * * This library 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 Lesser General Public License for more * details. */ package com.liferay.document.library.web.internal.portlet.toolbar.contributor; import com.liferay.document.library.kernel.model.DLFileEntryType; import com.liferay.document.library.kernel.model.DLFolder; import com.liferay.document.library.kernel.model.DLFolderConstants; import com.liferay.document.library.kernel.service.DLFileEntryTypeService; import com.liferay.document.library.portlet.toolbar.contributor.DLPortletToolbarContributorContext; import com.liferay.document.library.web.constants.DLPortletKeys; import com.liferay.document.library.web.internal.portlet.toolbar.contributor.helper.DLPortletToolbarContributorHelper; import com.liferay.osgi.service.tracker.collections.list.ServiceTrackerList; import com.liferay.osgi.service.tracker.collections.list.ServiceTrackerListFactory; import com.liferay.portal.kernel.exception.PortalException; import com.liferay.portal.kernel.language.LanguageUtil; import com.liferay.portal.kernel.log.Log; import com.liferay.portal.kernel.log.LogFactoryUtil; import com.liferay.portal.kernel.portlet.PortletURLFactoryUtil; import com.liferay.portal.kernel.portlet.toolbar.contributor.BasePortletToolbarContributor; import com.liferay.portal.kernel.portlet.toolbar.contributor.PortletToolbarContributor; import com.liferay.portal.kernel.repository.model.Folder; import com.liferay.portal.kernel.security.permission.ActionKeys; import com.liferay.portal.kernel.security.permission.BaseModelPermissionChecker; import com.liferay.portal.kernel.security.permission.PermissionChecker; import com.liferay.portal.kernel.servlet.taglib.ui.MenuItem; import com.liferay.portal.kernel.servlet.taglib.ui.URLMenuItem; import com.liferay.portal.kernel.theme.PortletDisplay; import com.liferay.portal.kernel.theme.ThemeDisplay; import com.liferay.portal.kernel.util.Constants; import com.liferay.portal.kernel.util.Portal; import com.liferay.portal.kernel.util.WebKeys; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.portlet.PortletRequest; import javax.portlet.PortletResponse; import javax.portlet.PortletURL; import org.osgi.framework.BundleContext; import org.osgi.service.component.annotations.Activate; import org.osgi.service.component.annotations.Component; import org.osgi.service.component.annotations.Deactivate; import org.osgi.service.component.annotations.Reference; /** * @author Sergio González * @author Roberto Díaz * @author Mauro Mariuzzo */ @Component( immediate = true, property = { "javax.portlet.name=" + DLPortletKeys.DOCUMENT_LIBRARY, "mvc.render.command.name=-", "mvc.render.command.name=/document_library/view", "mvc.render.command.name=/document_library/view_folder" }, service = { DLPortletToolbarContributor.class, PortletToolbarContributor.class } ) public class DLPortletToolbarContributor extends BasePortletToolbarContributor { public MenuItem getFileEntryTypeMenuItem( PortletRequest portletRequest, Folder folder, List<DLFileEntryType> fileEntryTypes, DLFileEntryType fileEntryType, ThemeDisplay themeDisplay) throws PortalException { URLMenuItem urlMenuItem = new URLMenuItem(); String label = LanguageUtil.get( _portal.getHttpServletRequest(portletRequest), fileEntryType.getUnambiguousName( fileEntryTypes, themeDisplay.getScopeGroupId(), themeDisplay.getLocale())); urlMenuItem.setLabel(label); PortletDisplay portletDisplay = themeDisplay.getPortletDisplay(); PortletURL portletURL = PortletURLFactoryUtil.create( portletRequest, portletDisplay.getId(), PortletRequest.RENDER_PHASE); portletURL.setParameter( "mvcRenderCommandName", "/document_library/edit_file_entry"); portletURL.setParameter(Constants.CMD, Constants.ADD); portletURL.setParameter( "redirect", _portal.getCurrentURL(portletRequest)); portletURL.setParameter( "repositoryId", String.valueOf(_getRepositoryId(themeDisplay, folder))); portletURL.setParameter( "folderId", String.valueOf(_getFolderId(folder))); portletURL.setParameter( "fileEntryTypeId", String.valueOf(fileEntryType.getFileEntryTypeId())); urlMenuItem.setURL(portletURL.toString()); return urlMenuItem; } public List<MenuItem> getPortletTitleAddDocumentMenuItems( Folder folder, ThemeDisplay themeDisplay, PortletRequest portletRequest) { long folderId = _getFolderId(folder); if (!containsPermission( themeDisplay.getPermissionChecker(), themeDisplay.getScopeGroupId(), folderId, ActionKeys.ADD_DOCUMENT)) { return Collections.emptyList(); } List<MenuItem> menuItems = new ArrayList<>(); long repositoryId = _getRepositoryId(themeDisplay, folder); if (themeDisplay.getScopeGroupId() != repositoryId) { menuItems.add( _getPortletTitleAddBasicDocumentMenuItem( folder, themeDisplay, portletRequest)); } else { menuItems.addAll( _getPortletTitleAddDocumentTypeMenuItems( folder, themeDisplay, portletRequest)); } return menuItems; } public MenuItem getPortletTitleAddFolderMenuItem( ThemeDisplay themeDisplay, PortletRequest portletRequest, Folder folder) { long folderId = _getFolderId(folder); if (!containsPermission( themeDisplay.getPermissionChecker(), themeDisplay.getScopeGroupId(), folderId, ActionKeys.ADD_FOLDER)) { return null; } URLMenuItem urlMenuItem = new URLMenuItem(); urlMenuItem.setLabel( LanguageUtil.get( _portal.getHttpServletRequest(portletRequest), (folder != null) ? "subfolder" : "folder")); PortletDisplay portletDisplay = themeDisplay.getPortletDisplay(); PortletURL portletURL = PortletURLFactoryUtil.create( portletRequest, portletDisplay.getId(), PortletRequest.RENDER_PHASE); portletURL.setParameter( "mvcRenderCommandName", "/document_library/edit_folder"); portletURL.setParameter( "redirect", _portal.getCurrentURL(portletRequest)); portletURL.setParameter( "repositoryId", String.valueOf(_getRepositoryId(themeDisplay, folder))); portletURL.setParameter("parentFolderId", String.valueOf(folderId)); portletURL.setParameter("ignoreRootFolder", Boolean.TRUE.toString()); urlMenuItem.setURL(portletURL.toString()); return urlMenuItem; } public MenuItem getPortletTitleAddMultipleDocumentsMenuItem( ThemeDisplay themeDisplay, PortletRequest portletRequest, Folder folder) { if ((folder != null) && !folder.isSupportsMultipleUpload()) { return null; } List<DLFileEntryType> fileEntryTypes = getFileEntryTypes( themeDisplay.getScopeGroupId(), folder); if (fileEntryTypes.isEmpty()) { return null; } long folderId = _getFolderId(folder); if (!containsPermission( themeDisplay.getPermissionChecker(), themeDisplay.getScopeGroupId(), folderId, ActionKeys.ADD_DOCUMENT)) { return null; } URLMenuItem urlMenuItem = new URLMenuItem(); urlMenuItem.setLabel( LanguageUtil.get( _portal.getHttpServletRequest(portletRequest), "multiple-documents")); PortletDisplay portletDisplay = themeDisplay.getPortletDisplay(); PortletURL portletURL = PortletURLFactoryUtil.create( portletRequest, portletDisplay.getId(), PortletRequest.RENDER_PHASE); portletURL.setParameter( "mvcRenderCommandName", "/document_library/upload_multiple_file_entries"); portletURL.setParameter( "redirect", _portal.getCurrentURL(portletRequest)); portletURL.setParameter( "repositoryId", String.valueOf(_getRepositoryId(themeDisplay, folder))); portletURL.setParameter("folderId", String.valueOf(folderId)); urlMenuItem.setURL(portletURL.toString()); return urlMenuItem; } public URLMenuItem getPortletTitleAddRepositoryMenuItem( Folder folder, ThemeDisplay themeDisplay, PortletRequest portletRequest) { if (folder != null) { return null; } if (!containsPermission( themeDisplay.getPermissionChecker(), themeDisplay.getScopeGroupId(), DLFolderConstants.DEFAULT_PARENT_FOLDER_ID, ActionKeys.ADD_REPOSITORY)) { return null; } URLMenuItem urlMenuItem = new URLMenuItem(); urlMenuItem.setLabel( LanguageUtil.get( _portal.getHttpServletRequest(portletRequest), "repository")); PortletDisplay portletDisplay = themeDisplay.getPortletDisplay(); PortletURL portletURL = PortletURLFactoryUtil.create( portletRequest, portletDisplay.getId(), PortletRequest.RENDER_PHASE); portletURL.setParameter( "mvcRenderCommandName", "/document_library/edit_repository"); portletURL.setParameter( "redirect", _portal.getCurrentURL(portletRequest)); urlMenuItem.setURL(portletURL.toString()); return urlMenuItem; } public URLMenuItem getPortletTitleAddShortcutMenuItem( Folder folder, ThemeDisplay themeDisplay, PortletRequest portletRequest) { if ((folder != null) && !folder.isSupportsShortcuts()) { return null; } long folderId = _getFolderId(folder); if (!containsPermission( themeDisplay.getPermissionChecker(), themeDisplay.getScopeGroupId(), folderId, ActionKeys.ADD_SHORTCUT)) { return null; } URLMenuItem urlMenuItem = new URLMenuItem(); urlMenuItem.setLabel( LanguageUtil.get( _portal.getHttpServletRequest(portletRequest), "shortcut")); PortletDisplay portletDisplay = themeDisplay.getPortletDisplay(); PortletURL portletURL = PortletURLFactoryUtil.create( portletRequest, portletDisplay.getId(), PortletRequest.RENDER_PHASE); portletURL.setParameter( "mvcRenderCommandName", "/document_library/edit_file_shortcut"); portletURL.setParameter( "redirect", _portal.getCurrentURL(portletRequest)); portletURL.setParameter( "repositoryId", String.valueOf(_getRepositoryId(themeDisplay, folder))); portletURL.setParameter("folderId", String.valueOf(folderId)); urlMenuItem.setURL(portletURL.toString()); return urlMenuItem; } @Activate protected void activate(BundleContext bundleContext) { _dlPortletToolbarContributorContexts = ServiceTrackerListFactory.open( bundleContext, DLPortletToolbarContributorContext.class); } protected void addPortletTitleAddDocumentMenuItems( List<MenuItem> menuItems, Folder folder, ThemeDisplay themeDisplay, PortletRequest portletRequest) { menuItems.addAll( getPortletTitleAddDocumentMenuItems( folder, themeDisplay, portletRequest)); } protected void addPortletTitleAddFolderMenuItem( List<MenuItem> menuItems, Folder folder, ThemeDisplay themeDisplay, PortletRequest portletRequest) { MenuItem portletTitleAddFolderMenuItem = getPortletTitleAddFolderMenuItem( themeDisplay, portletRequest, folder); if (portletTitleAddFolderMenuItem != null) { menuItems.add(portletTitleAddFolderMenuItem); } } protected void addPortletTitleAddMultipleDocumentsMenuItem( List<MenuItem> menuItems, Folder folder, ThemeDisplay themeDisplay, PortletRequest portletRequest) { MenuItem portletTitleAddMultipleDocumentsMenuItem = getPortletTitleAddMultipleDocumentsMenuItem( themeDisplay, portletRequest, folder); if (portletTitleAddMultipleDocumentsMenuItem != null) { menuItems.add(portletTitleAddMultipleDocumentsMenuItem); } } protected void addPortletTitleAddRepositoryMenuItem( List<MenuItem> menuItems, Folder folder, ThemeDisplay themeDisplay, PortletRequest portletRequest) { URLMenuItem portletTitleAddRepositoryMenuItem = getPortletTitleAddRepositoryMenuItem( folder, themeDisplay, portletRequest); if (portletTitleAddRepositoryMenuItem != null) { menuItems.add(portletTitleAddRepositoryMenuItem); } } protected void addPortletTitleAddShortcutMenuItem( List<MenuItem> menuItems, Folder folder, ThemeDisplay themeDisplay, PortletRequest portletRequest) { URLMenuItem portletTitleAddShortcutMenuItem = getPortletTitleAddShortcutMenuItem( folder, themeDisplay, portletRequest); if (portletTitleAddShortcutMenuItem != null) { menuItems.add(portletTitleAddShortcutMenuItem); } } protected boolean containsPermission( PermissionChecker permissionChecker, long groupId, long folderId, String actionId) { try { _baseModelPermissionChecker.checkBaseModel( permissionChecker, groupId, folderId, actionId); } catch (PortalException pe) { // LPS-52675 if (_log.isDebugEnabled()) { _log.debug(pe, pe); } return false; } return true; } @Deactivate protected void deactivate() { _dlPortletToolbarContributorContexts.close(); } protected List<DLFileEntryType> getFileEntryTypes( long groupId, Folder folder) { long folderId = _getFolderId(folder); boolean inherited = true; if ((folder != null) && (folder.getModel() instanceof DLFolder)) { DLFolder dlFolder = (DLFolder)folder.getModel(); if (dlFolder.getRestrictionType() == DLFolderConstants. RESTRICTION_TYPE_FILE_ENTRY_TYPES_AND_WORKFLOW) { inherited = false; } } List<DLFileEntryType> fileEntryTypes = Collections.emptyList(); if ((folder == null) || folder.isSupportsMetadata()) { try { fileEntryTypes = _dlFileEntryTypeService.getFolderFileEntryTypes( _portal.getCurrentAndAncestorSiteGroupIds(groupId), folderId, inherited); } catch (PortalException pe) { _log.error( "Unable to get file entry types for group " + groupId + " and folder " + folderId, pe); } } return fileEntryTypes; } @Override protected List<MenuItem> getPortletTitleMenuItems( PortletRequest portletRequest, PortletResponse portletResponse) { ThemeDisplay themeDisplay = (ThemeDisplay)portletRequest.getAttribute( WebKeys.THEME_DISPLAY); Folder folder = _dlPortletToolbarContributorHelper.getFolder( themeDisplay, portletRequest); List<MenuItem> menuItems = new ArrayList<>(); addPortletTitleAddFolderMenuItem( menuItems, folder, themeDisplay, portletRequest); addPortletTitleAddShortcutMenuItem( menuItems, folder, themeDisplay, portletRequest); addPortletTitleAddRepositoryMenuItem( menuItems, folder, themeDisplay, portletRequest); addPortletTitleAddMultipleDocumentsMenuItem( menuItems, folder, themeDisplay, portletRequest); addPortletTitleAddDocumentMenuItems( menuItems, folder, themeDisplay, portletRequest); for (DLPortletToolbarContributorContext dlPortletToolbarContributorContext : _dlPortletToolbarContributorContexts) { dlPortletToolbarContributorContext.updatePortletTitleMenuItems( menuItems, folder, themeDisplay, portletRequest, portletResponse); } return menuItems; } @Reference( target = "(model.class.name=com.liferay.document.library.kernel.model.DLFolder)", unbind = "-" ) protected void setBaseModelPermissionChecker( BaseModelPermissionChecker baseModelPermissionChecker) { _baseModelPermissionChecker = baseModelPermissionChecker; } @Reference(unbind = "-") protected void setDLFileEntryTypeService( DLFileEntryTypeService dlFileEntryTypeService) { _dlFileEntryTypeService = dlFileEntryTypeService; } @Reference(unbind = "-") protected void setDLPortletToolbarContributorHelper( DLPortletToolbarContributorHelper dlPortletToolbarContributorHelper) { _dlPortletToolbarContributorHelper = dlPortletToolbarContributorHelper; } private long _getFolderId(Folder folder) { long folderId = DLFolderConstants.DEFAULT_PARENT_FOLDER_ID; if (folder != null) { folderId = folder.getFolderId(); } return folderId; } private MenuItem _getPortletTitleAddBasicDocumentMenuItem( Folder folder, ThemeDisplay themeDisplay, PortletRequest portletRequest) { long folderId = _getFolderId(folder); URLMenuItem urlMenuItem = new URLMenuItem(); urlMenuItem.setLabel( LanguageUtil.get( _portal.getHttpServletRequest(portletRequest), "basic-document")); PortletDisplay portletDisplay = themeDisplay.getPortletDisplay(); PortletURL portletURL = PortletURLFactoryUtil.create( portletRequest, portletDisplay.getId(), PortletRequest.RENDER_PHASE); portletURL.setParameter( "mvcRenderCommandName", "/document_library/edit_file_entry"); portletURL.setParameter(Constants.CMD, Constants.ADD); portletURL.setParameter( "redirect", _portal.getCurrentURL(portletRequest)); portletURL.setParameter( "repositoryId", String.valueOf(_getRepositoryId(themeDisplay, folder))); portletURL.setParameter("folderId", String.valueOf(folderId)); urlMenuItem.setURL(portletURL.toString()); return urlMenuItem; } private List<MenuItem> _getPortletTitleAddDocumentTypeMenuItems( Folder folder, ThemeDisplay themeDisplay, PortletRequest portletRequest) { List<MenuItem> menuItems = new ArrayList<>(); List<DLFileEntryType> fileEntryTypes = getFileEntryTypes( themeDisplay.getScopeGroupId(), folder); for (DLFileEntryType fileEntryType : fileEntryTypes) { try { MenuItem urlMenuItem = getFileEntryTypeMenuItem( portletRequest, folder, fileEntryTypes, fileEntryType, themeDisplay); menuItems.add(urlMenuItem); } catch (PortalException pe) { _log.error( "Unable to add menu item for file entry type " + fileEntryType.getName(), pe); } } return menuItems; } private long _getRepositoryId(ThemeDisplay themeDisplay, Folder folder) { long repositoryId = themeDisplay.getScopeGroupId(); if (folder != null) { repositoryId = folder.getRepositoryId(); } return repositoryId; } private static final Log _log = LogFactoryUtil.getLog( DLPortletToolbarContributor.class); private BaseModelPermissionChecker _baseModelPermissionChecker; private DLFileEntryTypeService _dlFileEntryTypeService; private ServiceTrackerList <DLPortletToolbarContributorContext, DLPortletToolbarContributorContext> _dlPortletToolbarContributorContexts; private DLPortletToolbarContributorHelper _dlPortletToolbarContributorHelper; @Reference private Portal _portal; }