1 /*******************************************************************************
2 * Copyright Igor Barma, Alexandre Desoubeaux, Christian Martel, Eric Brun, Mathieu Amblard, Gwenael Gevet, Pierre Guillot, 2012
3 * Copyright Alexandre Desoubeaux, Christian Martel, Cedric Lecarpentier, Alexandre Lefevre, Marc Salvat 2014-2016
4 * Copyright Alexandre Desoubeaux, Christian Martel, Cedric Lecarpentier, Marc Salvat, Marc Suarez, Harifetra Ramamonjy 2017
5 * Copyright Alexandre Desoubeaux, Christian Martel, Cedric Lecarpentier, Alexandre Lefevre, Marc Salvat 2014-2016
6 * Copyright Alexandre Desoubeaux, Christian Martel, Cedric Lecarpentier, Marc Salvat, Marc Suarez, Harifetra Ramamonjy 2017
8 * This file is part of the work and learning management system Pentila Nero.
10 * Pentila Nero is free software. You can redistribute it and/or modify since
11 * you respect the terms of either (at least one of the both license) :
12 * - under the terms of the GNU Affero General Public License as
13 * published by the Free Software Foundation, either version 3 of the
14 * License, or (at your option) any later version.
15 * - the CeCILL-C as published by CeCILL-C; either version 1 of the
16 * License, or any later version
17 * - the GNU Lesser General Public License as published by the
18 * Free Software Foundation, either version 3 of the license,
19 * or (at your option) any later version.
21 * There are special exceptions to the terms and conditions of the
22 * licenses as they are applied to this software. View the full text of
23 * the exception in file LICENSE-PROJECT.txt in the directory of this software
26 * Pentila Nero is distributed in the hope that it will be useful,
27 * but WITHOUT ANY WARRANTY; without even the implied warranty of
28 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
29 * Licenses for more details.
31 * You should have received a copy of the GNU Affero General Public License
32 * and the CeCILL-C and the GNU Lesser General Public License along with
33 * Pentila Nero. If not, see :
34 * <http://www.gnu.org/licenses/> and
35 * <http://www.cecill.info/licences.fr.html>.
36 ******************************************************************************/
37 package com.pentila.entSavoie.utils;
39 import java.util.ArrayList;
40 import java.util.HashMap;
41 import java.util.LinkedHashMap;
42 import java.util.List;
45 import com.liferay.contacts.util.GroupFilter;
46 import com.liferay.contacts.util.OrganizationConstants;
47 import com.liferay.contacts.util.OrganizationFilter;
48 import com.liferay.portal.kernel.dao.orm.QueryUtil;
49 import com.liferay.portal.kernel.exception.SystemException;
50 import com.liferay.portal.kernel.json.JSONArray;
51 import com.liferay.portal.kernel.json.JSONFactoryUtil;
52 import com.liferay.portal.kernel.json.JSONObject;
53 import com.liferay.portal.kernel.log.Log;
54 import com.liferay.portal.kernel.log.LogFactoryUtil;
55 import com.liferay.portal.model.Group;
56 import com.liferay.portal.model.Organization;
57 import com.liferay.portal.model.Role;
58 import com.liferay.portal.model.RoleConstants;
59 import com.liferay.portal.model.User;
60 import com.liferay.portal.service.GroupLocalServiceUtil;
61 import com.liferay.portal.service.OrganizationLocalServiceUtil;
62 import com.liferay.portal.service.RoleLocalServiceUtil;
63 import com.liferay.portal.service.UserGroupRoleLocalServiceUtil;
64 import com.liferay.portal.service.UserLocalServiceUtil;
65 import com.liferay.portal.util.comparator.GroupNameComparator;
66 import com.pentila.entSavoie.ENTRoleUtilFactory;
67 import com.pentila.entSavoie.ENTRolesConstants;
68 import com.pentila.entSavoie.communityInfos.model.CommunityInfos;
69 import com.pentila.entSavoie.communityInfos.model.GroupInfos;
70 import com.pentila.entSavoie.communityInfos.service.CommunityInfosLocalServiceUtil;
71 import com.pentila.entSavoie.directory.OrganizationFinderServiceUtil;
73 public class GroupCacheUtil {
75 private static Log logger = LogFactoryUtil.getLog(GroupCacheUtil.class);
77 public static final String SCHOOLS = "schools";
78 public static final String INSTITUTIONAL_GROUPS = "institutionalGroups";
79 public static final String PERSONAL_GROUPS = "personalGroups";
80 public static final String OPENED_GROUPS = "openedGroups";
82 public static final String GROUP_ORG_ID = "orgId";
83 public static final String GROUP_ORG_NAME = "orgName";
84 public static final String GROUP_GROUP_ID = "groupId";
85 public static final String GROUP_GROUP_NAME = "groupName";
86 public static final String GROUP_IS_MIGRATED = "isMigrated";
87 public static final String GROUP_IS_DOCUMENTS = "isDocuments";
88 public static final String GROUP_IS_NEWS = "isNews";
89 public static final String GROUP_IS_FORUM = "isForum";
90 public static final String GROUP_IS_CDT = "isCdt";
91 public static final String GROUP_DEFAULT_VIEW = "defaultView";
92 public static final String GROUP_IS_ADMINISTRATOR = "isAdministrator";
95 private static final long EXPIRATION_TIME_MILLIS = 1800000;
97 public static void removeGroupCache(User user) {
98 String cacheKey="userGroups_"+user.getUserId();
99 ENTCacheUtils.removeObjectFromCache(cacheKey);
102 public static void removeGroupCache(long userId) {
103 String cacheKey="userGroups_"+userId;
104 ENTCacheUtils.removeObjectFromCache(cacheKey);
107 public static JSONObject getUserGroups(User user) {
109 String cacheKey="userGroups_"+user.getUserId();
111 // Get value from cache instance
112 JSONObject cacheObject = (JSONObject) ENTCacheUtils.getObjectFromCache(cacheKey);
113 if (cacheObject == null) {
114 long time0 = System.currentTimeMillis();
115 logger.info("Group list is not cached for user "+user.getFullName()+" => building it");
117 cacheObject = buildUserGroupsJson(user);
118 } catch (Exception e) {
119 logger.error("Error while building user's group list for user "+user.getFullName(), e);
121 long time1 = System.currentTimeMillis();
122 logger.info("Group list built for user "+user.getFullName()+" in "+(time1 - time0)+" ms");
123 ENTCacheUtils.storeObjectIntoCache(cacheKey, cacheObject, EXPIRATION_TIME_MILLIS);
125 //logger.info("User group list is cached for user "+user.getFullName()+" => using it");
132 public static List<Long> getUserGroupIdsWithNews(User user, String filter) {
134 List<Long> groupIdList = new ArrayList<Long>();
136 JSONObject userJson = getUserGroups(user);
138 // Get institutional groups
139 JSONArray institutionalGroups = getInstitutionalGroups(user, userJson, true);
140 for (int i = 0 ; i < institutionalGroups.length() ; i++) {
141 JSONObject institutionalGroup = institutionalGroups.getJSONObject(i);
142 if (institutionalGroup.getBoolean(GROUP_IS_NEWS) && !institutionalGroup.getBoolean(GROUP_IS_MIGRATED) && (filter.equals("") || institutionalGroup.getString(GROUP_GROUP_NAME).contains(filter))) {
143 groupIdList.add(institutionalGroup.getLong(GROUP_GROUP_ID));
147 // Get personal groups
148 JSONArray personalGroups = getPersonalGroups(user, userJson);
149 for (int i = 0 ; i < personalGroups.length() ; i++) {
150 JSONObject personalGroup = personalGroups.getJSONObject(i);
151 if (personalGroup.getBoolean(GROUP_IS_NEWS) && (filter.equals("") || personalGroup.getString(GROUP_GROUP_NAME).contains(filter))) {
152 groupIdList.add(personalGroup.getLong(GROUP_GROUP_ID));
157 JSONArray openedGroups = getOpenedGroups(user, userJson);
158 for (int i = 0 ; i < openedGroups.length() ; i++) {
159 JSONObject openedGroup = openedGroups.getJSONObject(i);
160 if (openedGroup.getBoolean(GROUP_IS_NEWS) && (filter.equals("") || openedGroup.getString(GROUP_GROUP_NAME).contains(filter))) {
161 groupIdList.add(openedGroup.getLong(GROUP_GROUP_ID));
165 userJson.put("hasArchivedOrgs", false);
169 public static List<Long> getUserPersonalAdminGroupIdsWithNews(User user, String filter) {
171 List<Long> groupIdList = new ArrayList<Long>();
173 JSONObject userJson = getUserGroups(user);
175 // Get personal groups
176 JSONArray personalGroups = getPersonalGroups(user, userJson);
177 for (int i = 0 ; i < personalGroups.length() ; i++) {
178 JSONObject personalGroup = personalGroups.getJSONObject(i);
179 if (personalGroup.getBoolean(GROUP_IS_NEWS) && (filter.equals("") || personalGroup.getString(GROUP_GROUP_NAME).contains(filter)) && personalGroup.getBoolean(GROUP_IS_ADMINISTRATOR)) {
180 groupIdList.add(personalGroup.getLong(GROUP_GROUP_ID));
188 public static JSONArray getUserGroupsWithDocuments(User user) {
190 JSONArray groupArray = JSONFactoryUtil.createJSONArray();
191 JSONObject userJson = getUserGroups(user);
193 // Get institutional groups
194 JSONArray institutionalGroups = getInstitutionalGroups(user, userJson);
195 for (int i = 0 ; i < institutionalGroups.length() ; i++) {
196 JSONObject institutionalGroup = institutionalGroups.getJSONObject(i);
197 if (institutionalGroup.getBoolean(GROUP_IS_DOCUMENTS) && !institutionalGroup.getBoolean(GROUP_IS_MIGRATED)) {
198 groupArray.put(institutionalGroup);
202 // Get personal groups
203 JSONArray personalGroups = getPersonalGroups(user, userJson);
204 for (int i = 0 ; i < personalGroups.length() ; i++) {
205 JSONObject personalGroup = personalGroups.getJSONObject(i);
206 if (personalGroup.getBoolean(GROUP_IS_DOCUMENTS)) {
207 groupArray.put(personalGroup);
212 JSONArray openedGroups = getOpenedGroups(user, userJson);
213 for (int i = 0 ; i < openedGroups.length() ; i++) {
214 JSONObject openedGroup = openedGroups.getJSONObject(i);
215 if (openedGroup.getBoolean(GROUP_IS_DOCUMENTS)) {
216 groupArray.put(openedGroup);
224 public static JSONArray getUserGroupsWithForums(User user) {
226 JSONArray groupArray = JSONFactoryUtil.createJSONArray();
227 JSONObject userJson = getUserGroups(user);
229 // Get institutional groups
230 JSONArray institutionalGroups = getInstitutionalGroups(user, userJson);
231 for (int i = 0 ; i < institutionalGroups.length() ; i++) {
232 JSONObject institutionalGroup = institutionalGroups.getJSONObject(i);
233 if (institutionalGroup.getBoolean(GROUP_IS_FORUM) && !institutionalGroup.getBoolean(GROUP_IS_MIGRATED)) {
234 groupArray.put(institutionalGroup);
238 // Get personal groups
239 JSONArray personalGroups = getPersonalGroups(user, userJson);
240 for (int i = 0 ; i < personalGroups.length() ; i++) {
241 JSONObject personalGroup = personalGroups.getJSONObject(i);
242 if (personalGroup.getBoolean(GROUP_IS_FORUM)) {
243 groupArray.put(personalGroup);
248 JSONArray openedGroups = getOpenedGroups(user, userJson);
249 for (int i = 0 ; i < openedGroups.length() ; i++) {
250 JSONObject openedGroup = openedGroups.getJSONObject(i);
251 if (openedGroup.getBoolean(GROUP_IS_FORUM)) {
252 groupArray.put(openedGroup);
258 public static JSONArray getInstitutionalGroups(User user) {
259 JSONObject json = getUserGroups(user);
260 return json.getJSONArray(INSTITUTIONAL_GROUPS);
263 public static JSONArray getInstitutionalGroups(User user, JSONObject json) {
264 return getInstitutionalGroups(user, json, false);
268 * Returns all user's institutional groups
269 * - if teacher or local admin : remove parent groups (except school-level parents org)
270 * - if parent : let parent groups
272 public static JSONArray getInstitutionalGroups(User user, JSONObject json, boolean withParentGroups) {
273 if (withParentGroups) {
274 return json.getJSONArray(INSTITUTIONAL_GROUPS);
276 boolean isParent = false;
278 isParent = RoleLocalServiceUtil.hasUserRole(user.getUserId(), user.getCompanyId(), ENTRolesConstants.NATIONAL_2, false);
279 } catch (Exception e) {
282 return json.getJSONArray(INSTITUTIONAL_GROUPS);
284 JSONArray institutionnalGroupsWithoutParents = JSONFactoryUtil.createJSONArray();
285 // Build the school-level group 'CLG - Parents' name
286 String schoolLevelParentsOrg = "";
287 JSONArray institutionnalGroups = json.getJSONArray(INSTITUTIONAL_GROUPS);
288 for (int i = 0 ; i < institutionnalGroups.length() ; i++) {
289 JSONObject group = institutionnalGroups.getJSONObject(i);
290 if (group.getString(GROUP_ORG_NAME).endsWith(OrganizationConstants.ORG_SUFFIX_PERSONNELS)) {
291 schoolLevelParentsOrg = group.getString(GROUP_ORG_NAME).substring(0, group.getString(GROUP_ORG_NAME).length() - OrganizationConstants.ORG_SUFFIX_PERSONNELS.length()) + OrganizationConstants.ORG_SUFFIX_PARENTS;
294 // Now filter all ' - Parents' suffixed groups, except for the school-level Parents group
295 for (int i = 0 ; i < institutionnalGroups.length() ; i++) {
296 JSONObject group = institutionnalGroups.getJSONObject(i);
297 if (!group.getString(GROUP_ORG_NAME).endsWith(OrganizationConstants.ORG_SUFFIX_PARENTS) || group.getString(GROUP_ORG_NAME).equals(schoolLevelParentsOrg)) {
298 institutionnalGroupsWithoutParents.put(group);
301 return institutionnalGroupsWithoutParents;
307 public static JSONArray getUserSchools(User user) {
308 JSONObject json = getUserGroups(user);
309 return json.getJSONArray(SCHOOLS);
312 public static JSONArray getPersonalGroups(User user) {
313 JSONObject json = getUserGroups(user);
314 return json.getJSONArray(PERSONAL_GROUPS);
317 public static JSONArray getPersonalGroups(User user, JSONObject json) {
318 return json.getJSONArray(PERSONAL_GROUPS);
321 public static JSONArray getOpenedGroups(User user) {
322 JSONObject json = getUserGroups(user);
323 return json.getJSONArray(OPENED_GROUPS);
326 public static JSONArray getOpenedGroups(User user, JSONObject json) {
327 return json.getJSONArray(OPENED_GROUPS);
332 * Builds the user's group list stored in cache
334 private static JSONObject buildUserGroupsJson(User user) {
336 JSONObject userGroupsJson = JSONFactoryUtil.createJSONObject();
338 Organization masterSchool = null;
340 masterSchool = OrganizationFinderServiceUtil.getEtabRatachement(user);
341 } catch (Exception e) {
342 logger.error("Error when fetching the master school for user "+user.getFullName(), e);
344 if (masterSchool != null) {
345 userGroupsJson.put("masterSchool", masterSchool.getOrganizationId());
349 JSONObject institutionalGroupsAndSchools = fetchUserInstitutionalGroups(user, false);
350 JSONArray institutionalGroups = institutionalGroupsAndSchools.getJSONArray(INSTITUTIONAL_GROUPS);
351 JSONArray enrichedInstitutionalGroups = enrichJsonWithGroupInfos(user.getCompanyId(), institutionalGroups);
352 enrichJsonWithAdminInfo(user, enrichedInstitutionalGroups);
353 userGroupsJson.put(SCHOOLS, institutionalGroupsAndSchools.getJSONArray(SCHOOLS));
354 userGroupsJson.put(INSTITUTIONAL_GROUPS, enrichedInstitutionalGroups);
357 JSONArray personalGroups = fetchUserPersonalGroups(user);
358 JSONArray enrichedPersonalGroups = enrichJsonWithGroupInfos(user.getCompanyId(), personalGroups);
359 userGroupsJson.put(PERSONAL_GROUPS, enrichedPersonalGroups);
362 JSONArray openedGroups = fetchOpenedGroups();
363 enrichJsonWithGroupInfos(user.getCompanyId(), openedGroups);
364 userGroupsJson.put(OPENED_GROUPS, openedGroups);
366 return userGroupsJson;
371 * Fetches the list of institutional organizations, archived or not
373 private static JSONObject fetchUserInstitutionalGroups(User user, boolean archive) {
375 JSONObject userInstitutionnalGroupsJson = JSONFactoryUtil.createJSONObject();
377 JSONArray jsonArray = JSONFactoryUtil.createJSONArray();
378 JSONArray jsonSchoolArray = JSONFactoryUtil.createJSONArray();
380 OrganizationFilter.buildSchoolYearRanges();
382 List<Organization> userOrgList = new ArrayList<Organization>();
384 userOrgList = user.getOrganizations();
385 } catch (Exception e) {
386 logger.error("Error while retrieving user organizations for user "+user.getFullName());
389 boolean hasWholeSchoolVisibility = false;
392 hasWholeSchoolVisibility = ENTRolesConstants.hasGlobalVisibilityOnGroupClassOnItsSchool(user);
393 } catch (Exception e) {
394 logger.error("Error when determining if user "+user.getFullName()+" has whole visibility on its school", e);
397 if (hasWholeSchoolVisibility) {
399 List<Organization> userSchoolList = OrganizationFilter.filterSchools(userOrgList);
401 // For the schools, get all classes
402 for (Organization school : userSchoolList) {
403 List<Organization> schoolClasses = getSchoolClasses(school);
404 userOrgList.addAll(schoolClasses);
408 // Filter archived organizations or not
409 List<Organization> archivedUserOrgList = new ArrayList<Organization>();
410 for (Organization org : userOrgList) {
411 if (archive == OrganizationFilter.isArchived(org)) {
412 archivedUserOrgList.add(org);
416 // Remove duplicates and org root
417 List<Organization> uniqueUserOrgList = new ArrayList<Organization>();
418 for (Organization org : archivedUserOrgList) {
420 if (org.isRoot() && !ENTRolesConstants.hasVisibilityOnOrgRoot(user)) {
423 if (!uniqueUserOrgList.contains(org)) {
424 uniqueUserOrgList.add(org);
426 } catch (Exception e) {
427 logger.error("Error when determining if user "+user.getFullName()+" has visibility on root organization", e);
431 // Get the associated group of these organizations
432 List<Group> groupList = new ArrayList<Group>();
434 groupList = GroupFilter.getGroupsFromOrganizations(uniqueUserOrgList);
435 } catch (Exception e) {
436 logger.error("Error while fetching groups related to user's orgs", e);
439 // Convert organizations to Json object
440 for (Organization org : uniqueUserOrgList) {
442 Group orgGroup = null;
443 for (Group group : groupList) {
444 if (group.getClassPK() == org.getOrganizationId()) {
450 JSONObject orgJson = convertOrganizationToJson(org, orgGroup, archive);
451 jsonArray.put(orgJson);
452 if (OrganizationFilter.isOrgSchool(org)) {
453 jsonSchoolArray.put(orgJson);
457 userInstitutionnalGroupsJson.put(SCHOOLS, jsonSchoolArray);
458 userInstitutionnalGroupsJson.put(INSTITUTIONAL_GROUPS, jsonArray);
460 return userInstitutionnalGroupsJson;
464 private static JSONArray fetchUserPersonalGroups(User user) {
466 JSONArray jsonResult = JSONFactoryUtil.createJSONArray();
468 LinkedHashMap<String, Object> groupParams = new LinkedHashMap<String, Object>();
469 groupParams.put("usersGroups", new Long(user.getUserId()));
470 groupParams.put("active", Boolean.TRUE);
471 GroupNameComparator gnc = new GroupNameComparator();
472 List<Group> userPersonalGroups = new ArrayList<Group>();
474 userPersonalGroups = GroupLocalServiceUtil.search(user.getCompanyId(), null, null, groupParams, QueryUtil.ALL_POS, QueryUtil.ALL_POS, gnc);
475 } catch (Exception e) {
476 logger.error("Error while retrieving the list of personal groups for user "+user.getFullName());
479 // Convert groups to Json
480 for (Group group : userPersonalGroups) {
482 if (group.getName().contains("LFR_ORGANIZATION")) {
485 CommunityInfos communityInfos = null;
487 communityInfos = CommunityInfosLocalServiceUtil.getCommunityInfosByGroupId(group.getGroupId());
488 } catch (Exception e) {
489 logger.error("Error when getting community infos associated to group "+group.getName()+" (id "+group.getGroupId()+")");
491 if (communityInfos != null && communityInfos.getStatus() != 3) {
493 boolean isGroupAdministrator = false;
496 Role administratorRole = RoleLocalServiceUtil.getRole(user.getCompanyId(), RoleConstants.SITE_ADMINISTRATOR);
497 boolean isSiteAdministrator = UserGroupRoleLocalServiceUtil.hasUserGroupRole(user.getUserId(), group.getGroupId(), administratorRole.getRoleId());
498 Role siteOwnerRole = RoleLocalServiceUtil.getRole(user.getCompanyId(), RoleConstants.SITE_OWNER);
499 boolean isSiteOwner = UserGroupRoleLocalServiceUtil.hasUserGroupRole(user.getUserId(), group.getGroupId(), siteOwnerRole.getRoleId());
500 isGroupAdministrator = isSiteAdministrator || isSiteOwner;
501 } catch (Exception e) {
502 logger.error("Error when determinig if user "+user.getUserId()+" is administrator of group "+group.getGroupId(), e);
505 JSONObject groupJson = convertGroupToJson(group, isGroupAdministrator);
506 jsonResult.put(groupJson);
514 private static JSONArray fetchOpenedGroups() {
516 JSONArray jsonResult = JSONFactoryUtil.createJSONArray();
518 // List<Group> openedGroups = new ArrayList<Group>();
520 // List<CommunityInfos> openedGroupsInfos = CommunityInfosLocalServiceUtil.getCommunityInfosByStatusPolitic(0, 2);
521 // for (CommunityInfos openedGroupInfos: openedGroupsInfos) {
522 // Group openedGroup = GroupLocalServiceUtil.getGroup(openedGroupInfos.getGroupId());
523 // openedGroups.add(openedGroup);
525 // } catch (Exception e) {
526 // logger.error("Error while fetching opened groups", e);
529 // // Convert groups to Json
530 // for (Group openedGroup : openedGroups) {
531 // JSONObject groupJson = convertGroupToJson(openedGroup);
532 // jsonResult.put(groupJson);
538 private static List<Organization> getSchoolClasses(Organization school) {
540 List<Organization> classesList = new ArrayList<Organization>();
543 classesList = OrganizationLocalServiceUtil.getOrganizations(school.getCompanyId(), school.getOrganizationId());
544 } catch (SystemException e) {
545 logger.info("Error when fetching the list of classes for school "+school.getName());
551 private static JSONObject convertOrganizationToJson(Organization org, Group orgGroup, boolean isMigrated) {
553 JSONObject orgJson = JSONFactoryUtil.createJSONObject();
555 orgJson.put(GROUP_ORG_ID, org.getOrganizationId());
556 orgJson.put(GROUP_ORG_NAME, org.getName());
557 orgJson.put(GROUP_GROUP_ID, orgGroup.getGroupId());
558 orgJson.put(GROUP_GROUP_NAME, orgGroup.getName());
559 orgJson.put(GROUP_IS_MIGRATED, isMigrated);
564 private static JSONObject convertGroupToJson(Group group, boolean isAdministrator) {
566 JSONObject groupJson = JSONFactoryUtil.createJSONObject();
568 groupJson.put(GROUP_GROUP_ID, group.getGroupId());
569 groupJson.put(GROUP_GROUP_NAME, group.getName());
570 groupJson.put(GROUP_IS_ADMINISTRATOR, isAdministrator);
576 private static void enrichJsonWithAdminInfo(User user, JSONArray jsonArray) {
579 Role roleAdministrator = RoleLocalServiceUtil.getRole(user.getCompanyId(), RoleConstants.SITE_ADMINISTRATOR);
580 Role roleOwner = RoleLocalServiceUtil.getRole(user.getCompanyId(), RoleConstants.SITE_OWNER);
581 Role adminGrpRole = ENTRoleUtilFactory.getInstance(user.getCompanyId()).getRole(ENTRolesConstants.GROUP_ADMIN);
582 Role teacher = RoleLocalServiceUtil.getRole(user.getCompanyId(), ENTRolesConstants.NATIONAL_3);
583 Role persDirRole = RoleLocalServiceUtil.getRole(user.getCompanyId(), ENTRolesConstants.NATIONAL_4);
585 boolean isLocalAdmin = RoleLocalServiceUtil.hasUserRole(user.getUserId(), adminGrpRole.getRoleId());
586 boolean isTeacher = RoleLocalServiceUtil.hasUserRole(user.getUserId(), teacher.getRoleId());
587 boolean isPersDir = RoleLocalServiceUtil.hasUserRole(user.getUserId(), persDirRole.getRoleId());
589 for (int i = 0 ; i < jsonArray.length() ; i++) {
590 JSONObject jsonObj = jsonArray.getJSONObject(i);
591 if (isLocalAdmin || isPersDir) {
592 jsonObj.put(GROUP_IS_ADMINISTRATOR, true);
595 String groupIdStr = jsonObj.getString(GROUP_GROUP_ID);
596 Long groupId = Long.parseLong(groupIdStr);
597 Group orgGroup = GroupLocalServiceUtil.getGroup(groupId);
599 boolean isAdministrator = UserGroupRoleLocalServiceUtil.hasUserGroupRole(user.getUserId(), orgGroup.getGroupId(), roleAdministrator.getRoleId());
600 boolean isOwner = UserGroupRoleLocalServiceUtil.hasUserGroupRole(user.getUserId(), orgGroup.getGroupId(), roleOwner.getRoleId());
601 boolean hasAdminRight = isAdministrator || isOwner || isLocalAdmin;
603 // Teachers and persdir have admin rights on their institutional groups
604 if (!hasAdminRight && !orgGroup.isRegularSite()) {
606 if(isTeacher || isPersDir) {
607 hasAdminRight = true;
612 } catch (Exception e) {
613 logger.error("Error while enriching group cache structure with the administrator info", e);
618 private static JSONArray enrichJsonWithGroupInfos(long companyId, JSONArray jsonArray) {
620 JSONArray result = JSONFactoryUtil.createJSONArray();
621 String defaultView = ENTMainUtilsLocalServiceUtil.getEntGroupDefaultView(companyId);
623 // Build the list of groupIds
624 List<Long> groupIdList = new ArrayList<Long>();
625 for (int i = 0 ; i < jsonArray.length() ; i++) {
626 JSONObject jsonObj = jsonArray.getJSONObject(i);
627 String groupIdStr = jsonObj.getString(GROUP_GROUP_ID);
628 Long groupId = Long.parseLong(groupIdStr);
629 groupIdList.add(groupId);
632 // Return if no group
633 if (groupIdList.size() == 0) {
637 // Fetch community infos and group infos for all these groups
638 Map<Long, CommunityInfos> communityInfosMap = new HashMap<Long, CommunityInfos>();
640 communityInfosMap = CommunityInfosLocalServiceUtil.getCommunityForGroups(groupIdList);
641 } catch (Exception e) {
642 logger.error("Error while getting community infos for all user's groups", e);
645 if (communityInfosMap == null || communityInfosMap.size() == 0) {
646 logger.error("Error : community infos map or group infos map is null or empty, no data enrichment performed");
650 Map<Long, GroupInfos> groupInfosMap = new HashMap<Long, GroupInfos>();
652 groupInfosMap = CommunityInfosLocalServiceUtil.getGroupInfosForGroups(groupIdList);
653 } catch (Exception e) {
654 logger.error("Error while getting group infos for all user's groups", e);
657 // Enrich the JSON structure
658 for (int i = 0 ; i < jsonArray.length() ; i++) {
659 JSONObject jsonObj = jsonArray.getJSONObject(i);
660 String groupIdStr = jsonObj.getString("groupId");
661 Long groupId = Long.parseLong(groupIdStr);
663 if (groupInfosMap != null && groupInfosMap.containsKey(groupId)) {
664 jsonObj.put(GROUP_DEFAULT_VIEW, groupInfosMap.get(groupId).getDefaultGroupView());
666 jsonObj.put(GROUP_DEFAULT_VIEW, defaultView);
669 //System.out.println("enrichJsonWithGroupInfos for groupId "+groupId);
670 CommunityInfos ci = communityInfosMap.get(groupId);
672 if (ci.getStatus() != 0) {
675 jsonObj.put(GROUP_IS_NEWS, ci.getIsNewsActive());
676 jsonObj.put(GROUP_IS_DOCUMENTS, ci.getIsDocumentsActive());
677 jsonObj.put(GROUP_IS_FORUM, ci.getIsForumActive());
678 jsonObj.put(GROUP_IS_CDT, ci.getViewInCDT());
686 * Add migrated organization to cache object if not already done
688 public static void addMigratedOrgs(User user) {
690 String cacheKey="userGroups_"+user.getUserId();
692 JSONObject userGroupsJson = getUserGroups(user);
694 // Fetch archived orgs if not already done
695 if (!userGroupsJson.getBoolean("hasArchivedOrgs")) {
696 JSONArray archivedOrgs = fetchUserInstitutionalGroups(user, true).getJSONArray(INSTITUTIONAL_GROUPS);
697 JSONArray enrichedArchivedOrgs = enrichJsonWithGroupInfos(user.getCompanyId(), archivedOrgs);
699 for (int i = 0 ; i < enrichedArchivedOrgs.length() ; i++) {
700 JSONObject archivedOrg = enrichedArchivedOrgs.getJSONObject(i);
701 userGroupsJson.getJSONArray(INSTITUTIONAL_GROUPS).put(archivedOrg);
703 userGroupsJson.put("hasArchivedOrgs", true);
705 // Expiration date in milliseconds
706 ENTCacheUtils.removeObjectFromCache(cacheKey);
707 ENTCacheUtils.storeObjectIntoCache(cacheKey, userGroupsJson, EXPIRATION_TIME_MILLIS);
712 public static void updateDefaultView (User user, long groupId, String defaultView) {
714 boolean found = false;
715 JSONObject userGroups = getUserGroups(user);
716 JSONArray institutionnalGroups = getInstitutionalGroups(user);
717 for (int i = 0 ; i < institutionnalGroups.length() ; i++) {
718 JSONObject institutionnalGroup = institutionnalGroups.getJSONObject(i);
719 String groupIdStr = institutionnalGroup.getString(GROUP_GROUP_ID);
720 Long jsonGroupId = Long.parseLong(groupIdStr);
722 if (jsonGroupId == groupId) {
723 institutionnalGroup.put(GROUP_DEFAULT_VIEW, defaultView);
728 JSONArray personalGroups = getPersonalGroups(user);
729 for (int i = 0 ; i < personalGroups.length() ; i++) {
730 JSONObject personalGroup = personalGroups.getJSONObject(i);
731 String groupIdStr = personalGroup.getString(GROUP_GROUP_ID);
732 Long jsonGroupId = Long.parseLong(groupIdStr);
734 if (jsonGroupId == groupId) {
735 personalGroup.put(GROUP_DEFAULT_VIEW, defaultView);
741 JSONArray openedGroups = getOpenedGroups(user);
742 for (int i = 0 ; i < openedGroups.length() ; i++) {
743 JSONObject openedGroup = openedGroups.getJSONObject(i);
744 String groupIdStr = openedGroup.getString(GROUP_GROUP_ID);
745 Long jsonGroupId = Long.parseLong(groupIdStr);
747 if (jsonGroupId == groupId) {
748 openedGroup.put(GROUP_DEFAULT_VIEW, defaultView);
754 // Store updated json into cache
755 String cacheKey="userGroups_"+user.getUserId();
756 ENTCacheUtils.storeObjectIntoCache(cacheKey, userGroups, EXPIRATION_TIME_MILLIS);
760 * Returns true if the given user is administrator of the personal group given
765 public static boolean isUserGroupAdmin(User user, long groupId) {
767 // Look into personal groups
768 JSONArray personalGroups = getPersonalGroups(user);
769 for (int i = 0 ; i < personalGroups.length() ; i++) {
770 JSONObject personalGroup = personalGroups.getJSONObject(i);
771 String groupIdStr = personalGroup.getString(GROUP_GROUP_ID);
772 Long jsonGroupId = Long.parseLong(groupIdStr);
774 if (jsonGroupId == groupId) {
775 return personalGroup.getBoolean(GROUP_IS_ADMINISTRATOR);
779 // Search into institutional groups
780 JSONArray institutionalGroups = getInstitutionalGroups(user);
781 for (int i = 0 ; i < institutionalGroups.length() ; i++) {
782 JSONObject institutionalGroup = institutionalGroups.getJSONObject(i);
783 String groupIdStr = institutionalGroup.getString(GROUP_GROUP_ID);
784 Long jsonGroupId = Long.parseLong(groupIdStr);
786 if (jsonGroupId == groupId) {
787 return institutionalGroup.getBoolean(GROUP_IS_ADMINISTRATOR);
794 * Returns true if the given user is administrator of the personal group given
799 public static void setAdmin(long userId, long groupId, boolean isAdmin) {
803 user = UserLocalServiceUtil.getUser(userId);
804 } catch (Exception e) {
805 logger.error("Error when fetching user with id "+userId);
809 // Look into personal groups
810 JSONObject userGroups = getUserGroups(user);
811 JSONArray personalGroups = getPersonalGroups(user, userGroups);
812 for (int i = 0 ; i < personalGroups.length() ; i++) {
813 JSONObject personalGroup = personalGroups.getJSONObject(i);
814 String groupIdStr = personalGroup.getString(GROUP_GROUP_ID);
815 Long jsonGroupId = Long.parseLong(groupIdStr);
817 if (jsonGroupId == groupId) {
818 personalGroup.put(GROUP_IS_ADMINISTRATOR, isAdmin);
822 // Search into institutional groups
823 JSONArray institutionalGroups = getInstitutionalGroups(user, userGroups);
824 for (int i = 0 ; i < institutionalGroups.length() ; i++) {
825 JSONObject institutionalGroup = institutionalGroups.getJSONObject(i);
826 String groupIdStr = institutionalGroup.getString(GROUP_GROUP_ID);
827 Long jsonGroupId = Long.parseLong(groupIdStr);
829 if (jsonGroupId == groupId) {
830 institutionalGroup.put(GROUP_IS_ADMINISTRATOR, isAdmin);
834 // Store updated json into cache
835 String cacheKey="userGroups_"+user.getUserId();
836 ENTCacheUtils.storeObjectIntoCache(cacheKey, userGroups, EXPIRATION_TIME_MILLIS);