001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.announcements.util;
016    
017    import com.liferay.portal.kernel.exception.PortalException;
018    import com.liferay.portal.kernel.exception.SystemException;
019    import com.liferay.portal.kernel.util.GetterUtil;
020    import com.liferay.portal.kernel.util.ListUtil;
021    import com.liferay.portal.kernel.util.PropsKeys;
022    import com.liferay.portal.kernel.util.PropsUtil;
023    import com.liferay.portal.kernel.util.UniqueList;
024    import com.liferay.portal.model.Group;
025    import com.liferay.portal.model.Organization;
026    import com.liferay.portal.model.Role;
027    import com.liferay.portal.model.RoleConstants;
028    import com.liferay.portal.model.Team;
029    import com.liferay.portal.model.User;
030    import com.liferay.portal.model.UserGroup;
031    import com.liferay.portal.service.GroupLocalServiceUtil;
032    import com.liferay.portal.service.OrganizationLocalServiceUtil;
033    import com.liferay.portal.service.RoleLocalServiceUtil;
034    import com.liferay.portal.service.TeamLocalServiceUtil;
035    import com.liferay.portal.service.UserGroupLocalServiceUtil;
036    import com.liferay.portal.service.UserLocalServiceUtil;
037    import com.liferay.portal.util.PortalUtil;
038    
039    import java.util.ArrayList;
040    import java.util.LinkedHashMap;
041    import java.util.List;
042    
043    /**
044     * @author Raymond Aug??
045     */
046    public class AnnouncementsUtil {
047    
048            public static LinkedHashMap<Long, long[]> getAnnouncementScopes(long userId)
049                    throws PortalException, SystemException {
050    
051                    LinkedHashMap<Long, long[]> scopes = new LinkedHashMap<Long, long[]>();
052    
053                    // General announcements
054    
055                    scopes.put(new Long(0), new long[] {0});
056    
057                    // Personal announcements
058    
059                    scopes.put(_USER_CLASS_NAME_ID, new long[] {userId});
060    
061                    // Organization announcements
062    
063                    List<Group> groupsList = new ArrayList<Group>();
064    
065                    List<Organization> organizations =
066                            OrganizationLocalServiceUtil.getUserOrganizations(userId);
067    
068                    if (!organizations.isEmpty()) {
069                            List<Organization> organizationsList =
070                                    new ArrayList<Organization>();
071    
072                            organizationsList.addAll(organizations);
073    
074                            for (Organization organization : organizations) {
075                                    groupsList.add(organization.getGroup());
076    
077                                    List<Organization> parentOrganizations =
078                                            OrganizationLocalServiceUtil.getParentOrganizations(
079                                                    organization.getOrganizationId());
080    
081                                    for (Organization parentOrganization : parentOrganizations) {
082                                            organizationsList.add(parentOrganization);
083                                            groupsList.add(parentOrganization.getGroup());
084                                    }
085                            }
086    
087                            scopes.put(
088                                    _ORGANIZATION_CLASS_NAME_ID,
089                                    _getOrganizationIds(organizationsList));
090                    }
091    
092                    // Site announcements
093    
094                    List<Group> groups = GroupLocalServiceUtil.getUserGroups(userId, true);
095    
096                    if (!groups.isEmpty()) {
097                            scopes.put(_GROUP_CLASS_NAME_ID, _getGroupIds(groups));
098    
099                            groupsList.addAll(groups);
100                    }
101    
102                    // User group announcements
103    
104                    List<UserGroup> userGroups =
105                            UserGroupLocalServiceUtil.getUserUserGroups(userId);
106    
107                    if (!userGroups.isEmpty()) {
108                            scopes.put(_USER_GROUP_CLASS_NAME_ID, _getUserGroupIds(userGroups));
109    
110                            for (UserGroup userGroup : userGroups) {
111                                    groupsList.add(userGroup.getGroup());
112                            }
113                    }
114    
115                    // Role announcements
116    
117                    List<Role> roles = new UniqueList<Role>();
118    
119                    if (!groupsList.isEmpty()) {
120                            roles = RoleLocalServiceUtil.getUserRelatedRoles(
121                                    userId, groupsList);
122    
123                            roles = ListUtil.copy(roles);
124    
125                            for (Group group : groupsList) {
126                                    roles.addAll(
127                                            RoleLocalServiceUtil.getUserGroupRoles(
128                                                    userId, group.getGroupId()));
129                                    roles.addAll(
130                                            RoleLocalServiceUtil.getUserGroupGroupRoles(
131                                                    userId, group.getGroupId()));
132                            }
133                    }
134                    else {
135                            roles = RoleLocalServiceUtil.getUserRoles(userId);
136    
137                            roles = ListUtil.copy(roles);
138                    }
139    
140                    List<Team> teams = TeamLocalServiceUtil.getUserTeams(userId);
141    
142                    for (Team team : teams) {
143                            roles.add(team.getRole());
144                    }
145    
146                    if (_PERMISSIONS_CHECK_GUEST_ENABLED) {
147                            User user = UserLocalServiceUtil.getUserById(userId);
148    
149                            Role guestRole = RoleLocalServiceUtil.getRole(
150                                    user.getCompanyId(), RoleConstants.GUEST);
151    
152                            roles.add(guestRole);
153                    }
154    
155                    if (roles.size() > 0) {
156                            scopes.put(_ROLE_CLASS_NAME_ID, _getRoleIds(roles));
157                    }
158    
159                    return scopes;
160            }
161    
162            private static long[] _getGroupIds(List<Group> groups) {
163                    long[] groupIds = new long[groups.size()];
164    
165                    int i = 0;
166    
167                    for (Group group : groups) {
168                            groupIds[i++] = group.getGroupId();
169                    }
170    
171                    return groupIds;
172            }
173    
174            private static long[] _getOrganizationIds(
175                    List<Organization> organizations) {
176    
177                    long[] organizationIds = new long[organizations.size()];
178    
179                    int i = 0;
180    
181                    for (Organization organization : organizations) {
182                            organizationIds[i++] = organization.getOrganizationId();
183                    }
184    
185                    return organizationIds;
186            }
187    
188            private static long[] _getRoleIds(List<Role> roles) {
189                    long[] roleIds = new long[roles.size()];
190    
191                    int i = 0;
192    
193                    for (Role role : roles) {
194                            roleIds[i++] = role.getRoleId();
195                    }
196    
197                    return roleIds;
198            }
199    
200            private static long[] _getUserGroupIds(List<UserGroup> userGroups) {
201                    long[] userGroupIds = new long[userGroups.size()];
202    
203                    int i = 0;
204    
205                    for (UserGroup userGroup : userGroups) {
206                            userGroupIds[i++] = userGroup.getUserGroupId();
207                    }
208    
209                    return userGroupIds;
210            }
211    
212            private static final long _GROUP_CLASS_NAME_ID = PortalUtil.getClassNameId(
213                    Group.class.getName());
214    
215            private static final long _ORGANIZATION_CLASS_NAME_ID =
216                    PortalUtil.getClassNameId(Organization.class.getName());
217    
218            private static final boolean _PERMISSIONS_CHECK_GUEST_ENABLED =
219                    GetterUtil.getBoolean(
220                            PropsUtil.get(PropsKeys.PERMISSIONS_CHECK_GUEST_ENABLED));
221    
222            private static final long _ROLE_CLASS_NAME_ID = PortalUtil.getClassNameId(
223                    Role.class.getName());
224    
225            private static final long _USER_CLASS_NAME_ID = PortalUtil.getClassNameId(
226                    User.class.getName());
227    
228            private static final long _USER_GROUP_CLASS_NAME_ID =
229                    PortalUtil.getClassNameId(UserGroup.class.getName());
230    
231    }