All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.liferay.roles.admin.web.internal.display.context.EditRolePermissionsSummaryDisplayContext Maven / Gradle / Ivy

The newest version!
/**
 * SPDX-FileCopyrightText: (c) 2000 Liferay, Inc. https://liferay.com
 * SPDX-License-Identifier: LGPL-2.1-or-later OR LicenseRef-Liferay-DXP-EULA-2.0.0-2023-06
 */

package com.liferay.roles.admin.web.internal.display.context;

import com.liferay.petra.string.StringBundler;
import com.liferay.petra.string.StringPool;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.dao.search.SearchContainer;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.language.LanguageUtil;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.Permission;
import com.liferay.portal.kernel.model.PermissionDisplay;
import com.liferay.portal.kernel.model.Resource;
import com.liferay.portal.kernel.model.ResourceConstants;
import com.liferay.portal.kernel.model.Role;
import com.liferay.portal.kernel.module.service.Snapshot;
import com.liferay.portal.kernel.portlet.LiferayPortletRequest;
import com.liferay.portal.kernel.portlet.LiferayPortletResponse;
import com.liferay.portal.kernel.portlet.url.builder.PortletURLBuilder;
import com.liferay.portal.kernel.security.permission.ResourceActionsUtil;
import com.liferay.portal.kernel.security.permission.RolePermissions;
import com.liferay.portal.kernel.service.GroupLocalServiceUtil;
import com.liferay.portal.kernel.service.PortletLocalServiceUtil;
import com.liferay.portal.kernel.service.ResourcePermissionLocalServiceUtil;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.Constants;
import com.liferay.portal.kernel.util.HtmlUtil;
import com.liferay.portal.kernel.util.LinkedHashMapBuilder;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.model.impl.ResourceImpl;
import com.liferay.portal.security.permission.converter.PermissionConverter;
import com.liferay.roles.admin.web.internal.group.type.contributor.util.GroupTypeContributorUtil;
import com.liferay.taglib.search.ResultRow;

import jakarta.portlet.PortletURL;
import jakarta.portlet.ResourceURL;

import jakarta.servlet.ServletContext;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @author Mariano Álvaro Sáiz
 */
public class EditRolePermissionsSummaryDisplayContext {

	public EditRolePermissionsSummaryDisplayContext(
		HttpServletRequest httpServletRequest,
		HttpServletResponse httpServletResponse,
		LiferayPortletRequest liferayPortletRequest,
		LiferayPortletResponse liferayPortletResponse,
		RoleDisplayContext roleDisplayContext, ServletContext servletContext) {

		_httpServletRequest = httpServletRequest;
		_httpServletResponse = httpServletResponse;
		_liferayPortletRequest = liferayPortletRequest;
		_liferayPortletResponse = liferayPortletResponse;
		_roleDisplayContext = roleDisplayContext;
		_servletContext = servletContext;

		_themeDisplay = (ThemeDisplay)httpServletRequest.getAttribute(
			WebKeys.THEME_DISPLAY);
	}

	public SearchContainer getSearchContainer()
		throws PortalException {

		if (_searchContainer != null) {
			return _searchContainer;
		}

		_searchContainer = new SearchContainer(
			_liferayPortletRequest, null, null,
			SearchContainer.DEFAULT_CUR_PARAM, SearchContainer.DEFAULT_DELTA,
			_getPermissionsAllURL(), _getHeaderNames(),
			"this-role-does-not-have-any-permissions");

		_searchContainer.setResultsAndTotal(
			ListUtil.sort(_getPermissionDisplays()));

		_updateSearchContainerResultRows();

		return _searchContainer;
	}

	private List _getHeaderNames() {
		if (_headerNames != null) {
			return _headerNames;
		}

		_headerNames = new ArrayList() {
			{
				add("permissions");
			}
		};

		if (_roleDisplayContext.isAllowGroupScope()) {
			_headerNames.add("sites-and-asset-libraries");
		}

		_headerNames.add(StringPool.BLANK);

		return _headerNames;
	}

	private List _getPermissionDisplays()
		throws PortalException {

		if (_permissionDisplays != null) {
			return _permissionDisplays;
		}

		PermissionConverter permissionConverter =
			_permissionConverterSnapshot.get();

		List permissions = permissionConverter.convertPermissions(
			_getRole());

		_permissionDisplays = new ArrayList<>(permissions.size());

		for (Permission permission : permissions) {
			if (!_roleDisplayContext.isValidPermission(
					_getRole(), permission)) {

				continue;
			}

			Resource resource = new ResourceImpl() {
				{
					setCompanyId(_themeDisplay.getCompanyId());
					setName(permission.getName());
					setPrimKey(permission.getPrimKey());
					setScope(permission.getScope());
				}
			};

			String currentPortletName = null;
			String currentModelName = StringPool.BLANK;
			String currentModelLabel = StringPool.BLANK;

			if (PortletLocalServiceUtil.hasPortlet(
					_themeDisplay.getCompanyId(), resource.getName())) {

				currentPortletName = resource.getName();
				currentModelLabel = StringPool.BLANK;
			}
			else {
				currentModelName = resource.getName();

				currentModelLabel = ResourceActionsUtil.getModelResource(
					_httpServletRequest, currentModelName);

				List portletResources =
					ResourceActionsUtil.getModelPortletResources(
						currentModelName);

				if (!portletResources.isEmpty()) {
					currentPortletName = portletResources.get(0);
				}
			}

			if (currentPortletName == null) {
				continue;
			}

			String actionId = permission.getActionId();

			PermissionDisplay permissionDisplay = new PermissionDisplay(
				permission, resource, currentPortletName,
				PortalUtil.getPortletLongTitle(
					PortletLocalServiceUtil.getPortletById(
						_themeDisplay.getCompanyId(), currentPortletName),
					_servletContext, _themeDisplay.getLocale()),
				currentModelName, currentModelLabel, actionId,
				_roleDisplayContext.getActionLabel(
					resource.getName(), actionId));

			if (!_permissionDisplays.contains(permissionDisplay)) {
				_permissionDisplays.add(permissionDisplay);
			}
		}

		return _permissionDisplays;
	}

	private PortletURL _getPermissionsAllURL() {
		if (_permissionsAllURL != null) {
			return _permissionsAllURL;
		}

		_permissionsAllURL = PortletURLBuilder.createRenderURL(
			_liferayPortletResponse
		).setMVCPath(
			"/edit_role_permissions.jsp"
		).setCMD(
			Constants.VIEW
		).setBackURL(
			ParamUtil.getString(
				_httpServletRequest, "backURL",
				ParamUtil.getString(_httpServletRequest, "redirect"))
		).setTabs1(
			_roleDisplayContext.getEditRolePermissionsTabs1()
		).setTabs2(
			"roles"
		).setParameter(
			"accountRoleGroupScope",
			_roleDisplayContext.isAccountRoleGroupScope()
		).setParameter(
			"roleId",
			() -> {
				Role role = _getRole();

				return role.getRoleId();
			}
		).buildPortletURL();

		return _permissionsAllURL;
	}

	private Role _getRole() {
		if (_role != null) {
			return _role;
		}

		_role = (Role)_httpServletRequest.getAttribute(
			"edit_role_permissions.jsp-role");

		return _role;
	}

	private void _updateSearchContainerResultRows() throws PortalException {
		List resultRows =
			_searchContainer.getResultRows();

		Role role = _getRole();

		List results = _searchContainer.getResults();

		for (int i = 0; i < results.size(); i++) {
			PermissionDisplay permissionDisplay = results.get(i);

			Resource resource = permissionDisplay.getResource();

			String currentResource = resource.getName();

			String actionId = permissionDisplay.getActionId();

			List groups = Collections.emptyList();

			int scope = ResourceConstants.SCOPE_COMPANY;

			if (_roleDisplayContext.isAllowGroupScope()) {
				groups = GroupLocalServiceUtil.search(
					_themeDisplay.getCompanyId(),
					GroupTypeContributorUtil.getClassNameIds(), null, null,
					LinkedHashMapBuilder.put(
						"rolePermissions",
						new RolePermissions(
							currentResource, ResourceConstants.SCOPE_GROUP,
							actionId, role.getRoleId())
					).build(),
					true, QueryUtil.ALL_POS, QueryUtil.ALL_POS);

				if (groups.isEmpty()) {
					scope = ResourceConstants.SCOPE_COMPANY;
				}
				else {
					scope = ResourceConstants.SCOPE_GROUP;
				}
			}
			else {
				scope = ResourceConstants.SCOPE_GROUP_TEMPLATE;
			}

			Permission permission = permissionDisplay.getPermission();

			String[] primKeys = {permission.getPrimKey()};

			if (scope == ResourceConstants.SCOPE_GROUP) {
				primKeys = new String[groups.size()];

				for (int j = 0; j < groups.size(); j++) {
					Group group = groups.get(j);

					primKeys[j] = String.valueOf(group.getGroupId());
				}
			}

			ResultRow row = new ResultRow(
				new Object[] {permission, role, primKeys}, actionId, i);

			boolean selected =
				ResourcePermissionLocalServiceUtil.hasScopeResourcePermission(
					_themeDisplay.getCompanyId(), currentResource, scope,
					role.getRoleId(), actionId);

			if (!selected) {
				continue;
			}

			String currentPortletName = permissionDisplay.getPortletName();
			String currentPortletLabel = permissionDisplay.getPortletLabel();
			String currentModelLabel = permissionDisplay.getModelLabel();

			ResourceURL editPermissionsResourceURL =
				_liferayPortletResponse.createResourceURL();

			editPermissionsResourceURL.setParameter(
				"mvcPath", "/view_resources.jsp");
			editPermissionsResourceURL.setParameter(
				Constants.CMD, Constants.EDIT);
			editPermissionsResourceURL.setParameter("tabs2", "roles");
			editPermissionsResourceURL.setParameter(
				"roleId", String.valueOf(role.getRoleId()));
			editPermissionsResourceURL.setParameter(
				"redirect", String.valueOf(_getPermissionsAllURL()));
			editPermissionsResourceURL.setParameter(
				"portletResource", currentPortletName);
			editPermissionsResourceURL.setParameter(
				"accountRoleGroupScope",
				String.valueOf(_roleDisplayContext.isAccountRoleGroupScope()));

			PortletURL editPermissionsURL = PortletURLBuilder.createRenderURL(
				_liferayPortletResponse
			).setMVCPath(
				"/edit_role_permissions.jsp"
			).setCMD(
				Constants.EDIT
			).setRedirect(
				_getPermissionsAllURL()
			).setPortletResource(
				currentPortletName
			).setTabs1(
				_roleDisplayContext.getEditRolePermissionsTabs1()
			).setTabs2(
				"roles"
			).setParameter(
				"accountRoleGroupScope",
				_roleDisplayContext.isAccountRoleGroupScope()
			).setParameter(
				"roleId", role.getRoleId()
			).buildPortletURL();

			StringBundler sb = new StringBundler(18);

			sb.append("");
			sb.append(currentPortletLabel);

			if (Validator.isNotNull(currentModelLabel)) {
				sb.append(StringPool.SPACE);
				sb.append(StringPool.GREATER_THAN);
				sb.append(StringPool.SPACE);
				sb.append(currentModelLabel);
			}

			sb.append(": ");
			sb.append(permissionDisplay.getActionLabel());
			sb.append("");

			row.addText(sb.toString());

			if (scope == ResourceConstants.SCOPE_COMPANY) {
				if (_roleDisplayContext.isShowScope(
						role, currentResource, currentPortletName)) {

					row.addText(
						LanguageUtil.get(
							_httpServletRequest,
							"all-sites-and-asset-libraries"));
				}
				else {
					row.addText(StringPool.BLANK);
				}
			}
			else if (scope == ResourceConstants.SCOPE_GROUP) {
				sb = new StringBundler((groups.size() * 3) - 2);

				for (int j = 0; j < groups.size(); j++) {
					Group group = groups.get(j);

					sb.append(
						HtmlUtil.escape(
							group.getDescriptiveName(
								_themeDisplay.getLocale())));

					if (j < (groups.size() - 1)) {
						sb.append(StringPool.COMMA);
						sb.append(StringPool.SPACE);
					}
				}

				row.addText(sb.toString());
			}

			// Action

			row.addJSP(
				"/permission_action.jsp", "entry-action", _servletContext,
				_httpServletRequest, _httpServletResponse);

			resultRows.add(row);
		}
	}

	private static final Snapshot
		_permissionConverterSnapshot = new Snapshot<>(
			EditRolePermissionsSummaryDisplayContext.class,
			PermissionConverter.class);

	private List _headerNames;
	private final HttpServletRequest _httpServletRequest;
	private final HttpServletResponse _httpServletResponse;
	private final LiferayPortletRequest _liferayPortletRequest;
	private final LiferayPortletResponse _liferayPortletResponse;
	private List _permissionDisplays;
	private PortletURL _permissionsAllURL;
	private Role _role;
	private final RoleDisplayContext _roleDisplayContext;
	private SearchContainer _searchContainer;
	private final ServletContext _servletContext;
	private final ThemeDisplay _themeDisplay;

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy