/**
* 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.announcements.kernel.util;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.model.Group;
import com.liferay.portal.kernel.model.Organization;
import com.liferay.portal.kernel.model.Role;
import com.liferay.portal.kernel.model.RoleConstants;
import com.liferay.portal.kernel.model.Team;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.model.UserGroup;
import com.liferay.portal.kernel.model.UserGroupGroupRole;
import com.liferay.portal.kernel.model.UserGroupRole;
import com.liferay.portal.kernel.security.permission.ActionKeys;
import com.liferay.portal.kernel.security.permission.UserBag;
import com.liferay.portal.kernel.security.permission.UserBagFactoryUtil;
import com.liferay.portal.kernel.service.GroupLocalServiceUtil;
import com.liferay.portal.kernel.service.OrganizationLocalServiceUtil;
import com.liferay.portal.kernel.service.RoleLocalServiceUtil;
import com.liferay.portal.kernel.service.TeamLocalServiceUtil;
import com.liferay.portal.kernel.service.UserGroupGroupRoleLocalServiceUtil;
import com.liferay.portal.kernel.service.UserGroupLocalServiceUtil;
import com.liferay.portal.kernel.service.UserGroupRoleLocalServiceUtil;
import com.liferay.portal.kernel.service.UserLocalServiceUtil;
import com.liferay.portal.kernel.service.permission.GroupPermissionUtil;
import com.liferay.portal.kernel.service.permission.OrganizationPermissionUtil;
import com.liferay.portal.kernel.service.permission.RolePermissionUtil;
import com.liferay.portal.kernel.service.permission.UserGroupPermissionUtil;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.ArrayUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.ListUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.PropsKeys;
import com.liferay.portal.kernel.util.PropsUtil;
import com.liferay.portal.kernel.util.SetUtil;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Set;
/**
* @author Raymond Augé
*/
public class AnnouncementsUtil {
/**
* @deprecated As of 7.0.0, replaced by {@link #getAnnouncementScopes(User)}
*/
@Deprecated
public static LinkedHashMap<Long, long[]> getAnnouncementScopes(long userId)
throws PortalException {
return getAnnouncementScopes(UserLocalServiceUtil.getUserById(userId));
}
public static LinkedHashMap<Long, long[]> getAnnouncementScopes(User user)
throws PortalException {
long userId = user.getUserId();
LinkedHashMap<Long, long[]> scopes = new LinkedHashMap<>();
// General announcements
scopes.put(Long.valueOf(0), new long[] {0});
// Personal announcements
scopes.put(_USER_CLASS_NAME_ID, new long[] {userId});
// Organization announcements
UserBag userBag = UserBagFactoryUtil.create(userId);
long[] organizationIds = userBag.getUserOrgIds();
if (organizationIds.length > 0) {
scopes.put(_ORGANIZATION_CLASS_NAME_ID, organizationIds);
}
// Site announcements
long[] groupIds = userBag.getUserGroupIds();
if (groupIds.length > 0) {
scopes.put(_GROUP_CLASS_NAME_ID, groupIds);
}
// User group announcements
List<UserGroup> userGroups =
UserGroupLocalServiceUtil.getUserUserGroups(userId);
if (!userGroups.isEmpty()) {
long[] userGroupIds = ListUtil.toLongArray(
userGroups, UserGroup.USER_GROUP_ID_ACCESSOR);
scopes.put(_USER_GROUP_CLASS_NAME_ID, userGroupIds);
}
// Role announcements
Set<Long> roleIds = SetUtil.fromArray(userBag.getRoleIds());
if ((groupIds.length > 0) || (organizationIds.length > 0)) {
List<UserGroupRole> userGroupRoles =
UserGroupRoleLocalServiceUtil.getUserGroupRoles(userId);
for (UserGroupRole userGroupRole : userGroupRoles) {
roleIds.add(userGroupRole.getRoleId());
}
}
if (!userGroups.isEmpty()) {
List<UserGroupGroupRole> userGroupGroupRoles =
UserGroupGroupRoleLocalServiceUtil.getUserGroupGroupRolesByUser(
userId);
for (UserGroupGroupRole userGroupGroupRole : userGroupGroupRoles) {
roleIds.add(userGroupGroupRole.getRoleId());
}
}
List<Team> teams = TeamLocalServiceUtil.getUserTeams(userId);
long[] teamIds = ListUtil.toLongArray(teams, Team.TEAM_ID_ACCESSOR);
long companyId = user.getCompanyId();
if (teamIds.length > 0) {
List<Role> teamsRoles = RoleLocalServiceUtil.getTeamsRoles(
companyId, teamIds);
for (Role teamRole : teamsRoles) {
roleIds.add(teamRole.getRoleId());
}
}
if (_PERMISSIONS_CHECK_GUEST_ENABLED) {
Role guestRole = RoleLocalServiceUtil.getRole(
companyId, RoleConstants.GUEST);
roleIds.add(guestRole.getRoleId());
}
if (!roleIds.isEmpty()) {
scopes.put(_ROLE_CLASS_NAME_ID, ArrayUtil.toLongArray(roleIds));
}
return scopes;
}
public static List<Group> getGroups(ThemeDisplay themeDisplay)
throws Exception {
List<Group> filteredGroups = new ArrayList<>();
List<Group> groups = GroupLocalServiceUtil.getUserGroups(
themeDisplay.getUserId(), true);
for (Group group : groups) {
if (((group.isOrganization() && group.isSite()) ||
group.isRegularSite()) &&
GroupPermissionUtil.contains(
themeDisplay.getPermissionChecker(), group.getGroupId(),
ActionKeys.MANAGE_ANNOUNCEMENTS)) {
filteredGroups.add(group);
}
}
return filteredGroups;
}
public static List<Organization> getOrganizations(ThemeDisplay themeDisplay)
throws Exception {
List<Organization> filteredOrganizations = new ArrayList<>();
List<Organization> organizations =
OrganizationLocalServiceUtil.getUserOrganizations(
themeDisplay.getUserId());
for (Organization organization : organizations) {
if (OrganizationPermissionUtil.contains(
themeDisplay.getPermissionChecker(),
organization.getOrganizationId(),
ActionKeys.MANAGE_ANNOUNCEMENTS)) {
filteredOrganizations.add(organization);
}
}
return filteredOrganizations;
}
public static List<Role> getRoles(ThemeDisplay themeDisplay)
throws Exception {
List<Role> filteredRoles = new ArrayList<>();
List<Role> roles = RoleLocalServiceUtil.getRoles(
themeDisplay.getCompanyId());
for (Role role : roles) {
if (role.isTeam()) {
Team team = TeamLocalServiceUtil.getTeam(role.getClassPK());
if (GroupPermissionUtil.contains(
themeDisplay.getPermissionChecker(), team.getGroupId(),
ActionKeys.MANAGE_ANNOUNCEMENTS) ||
RolePermissionUtil.contains(
themeDisplay.getPermissionChecker(),
themeDisplay.getScopeGroupId(), role.getRoleId(),
ActionKeys.MANAGE_ANNOUNCEMENTS)) {
filteredRoles.add(role);
}
}
else if (RolePermissionUtil.contains(
themeDisplay.getPermissionChecker(), role.getRoleId(),
ActionKeys.MANAGE_ANNOUNCEMENTS)) {
filteredRoles.add(role);
}
}
return filteredRoles;
}
public static List<UserGroup> getUserGroups(ThemeDisplay themeDisplay)
throws Exception {
List<UserGroup> filteredUserGroups = new ArrayList<>();
List<UserGroup> userGroups = UserGroupLocalServiceUtil.getUserGroups(
themeDisplay.getCompanyId());
for (UserGroup userGroup : userGroups) {
if (UserGroupPermissionUtil.contains(
themeDisplay.getPermissionChecker(),
userGroup.getUserGroupId(),
ActionKeys.MANAGE_ANNOUNCEMENTS)) {
filteredUserGroups.add(userGroup);
}
}
return filteredUserGroups;
}
private static final long _GROUP_CLASS_NAME_ID = PortalUtil.getClassNameId(
Group.class.getName());
private static final long _ORGANIZATION_CLASS_NAME_ID =
PortalUtil.getClassNameId(Organization.class.getName());
private static final boolean _PERMISSIONS_CHECK_GUEST_ENABLED =
GetterUtil.getBoolean(
PropsUtil.get(PropsKeys.PERMISSIONS_CHECK_GUEST_ENABLED));
private static final long _ROLE_CLASS_NAME_ID = PortalUtil.getClassNameId(
Role.class.getName());
private static final long _USER_CLASS_NAME_ID = PortalUtil.getClassNameId(
User.class.getName());
private static final long _USER_GROUP_CLASS_NAME_ID =
PortalUtil.getClassNameId(UserGroup.class.getName());
}