001
014
015 package com.liferay.portal.service.impl;
016
017 import com.liferay.portal.DuplicateUserGroupException;
018 import com.liferay.portal.NoSuchUserGroupException;
019 import com.liferay.portal.RequiredUserGroupException;
020 import com.liferay.portal.UserGroupNameException;
021 import com.liferay.portal.kernel.exception.PortalException;
022 import com.liferay.portal.kernel.exception.SystemException;
023 import com.liferay.portal.kernel.lar.PortletDataHandlerKeys;
024 import com.liferay.portal.kernel.lar.UserIdStrategy;
025 import com.liferay.portal.kernel.search.Indexer;
026 import com.liferay.portal.kernel.search.IndexerRegistryUtil;
027 import com.liferay.portal.kernel.util.CharPool;
028 import com.liferay.portal.kernel.util.OrderByComparator;
029 import com.liferay.portal.kernel.util.Validator;
030 import com.liferay.portal.kernel.workflow.WorkflowConstants;
031 import com.liferay.portal.model.Group;
032 import com.liferay.portal.model.ResourceConstants;
033 import com.liferay.portal.model.Team;
034 import com.liferay.portal.model.User;
035 import com.liferay.portal.model.UserGroup;
036 import com.liferay.portal.model.UserGroupConstants;
037 import com.liferay.portal.security.ldap.LDAPUserGroupTransactionThreadLocal;
038 import com.liferay.portal.security.permission.PermissionCacheUtil;
039 import com.liferay.portal.service.base.UserGroupLocalServiceBaseImpl;
040 import com.liferay.portal.util.PropsValues;
041
042 import java.io.File;
043
044 import java.util.ArrayList;
045 import java.util.LinkedHashMap;
046 import java.util.List;
047 import java.util.Map;
048
049
054 public class UserGroupLocalServiceImpl extends UserGroupLocalServiceBaseImpl {
055
056
063 public void addGroupUserGroups(long groupId, long[] userGroupIds)
064 throws SystemException {
065
066 groupPersistence.addUserGroups(groupId, userGroupIds);
067
068 PermissionCacheUtil.clearCache();
069 }
070
071
078 public void addTeamUserGroups(long teamId, long[] userGroupIds)
079 throws SystemException {
080
081 teamPersistence.addUserGroups(teamId, userGroupIds);
082
083 PermissionCacheUtil.clearCache();
084 }
085
086
104 public UserGroup addUserGroup(
105 long userId, long companyId, String name, String description)
106 throws PortalException, SystemException {
107
108
109
110 validate(0, companyId, name);
111
112 long userGroupId = counterLocalService.increment();
113
114 UserGroup userGroup = userGroupPersistence.create(userGroupId);
115
116 userGroup.setCompanyId(companyId);
117 userGroup.setParentUserGroupId(
118 UserGroupConstants.DEFAULT_PARENT_USER_GROUP_ID);
119 userGroup.setName(name);
120 userGroup.setDescription(description);
121 userGroup.setAddedByLDAPImport(
122 LDAPUserGroupTransactionThreadLocal.isOriginatesFromLDAP());
123
124 userGroupPersistence.update(userGroup, false);
125
126
127
128 groupLocalService.addGroup(
129 userId, UserGroup.class.getName(), userGroup.getUserGroupId(),
130 String.valueOf(userGroupId), null, 0, null, false, true, null);
131
132
133
134 resourceLocalService.addResources(
135 companyId, 0, userId, UserGroup.class.getName(),
136 userGroup.getUserGroupId(), false, false, false);
137
138 return userGroup;
139 }
140
141
152 public void clearUserUserGroups(long userId) throws SystemException {
153 userPersistence.clearUserGroups(userId);
154
155 PermissionCacheUtil.clearCache();
156 }
157
158
169 public void copyUserGroupLayouts(long userGroupId, long userIds[])
170 throws PortalException, SystemException {
171
172 Map<String, String[]> parameterMap = getLayoutTemplatesParameters();
173
174 File[] files = exportLayouts(userGroupId, parameterMap);
175
176 try {
177 for (long userId : userIds) {
178 if (!userGroupPersistence.containsUser(userGroupId, userId)) {
179 importLayouts(userId, parameterMap, files[0], files[1]);
180 }
181 }
182 }
183 finally {
184 if (files[0] != null) {
185 files[0].delete();
186 }
187
188 if (files[1] != null) {
189 files[1].delete();
190 }
191 }
192 }
193
194
204 public void copyUserGroupLayouts(long userGroupIds[], long userId)
205 throws PortalException, SystemException {
206
207 for (long userGroupId : userGroupIds) {
208 if (!userGroupPersistence.containsUser(userGroupId, userId)) {
209 copyUserGroupLayouts(userGroupId, userId);
210 }
211 }
212 }
213
214
224 public void copyUserGroupLayouts(long userGroupId, long userId)
225 throws PortalException, SystemException {
226
227 Map<String, String[]> parameterMap = getLayoutTemplatesParameters();
228
229 File[] files = exportLayouts(userGroupId, parameterMap);
230
231 try {
232 importLayouts(userId, parameterMap, files[0], files[1]);
233 }
234 finally {
235 if (files[0] != null) {
236 files[0].delete();
237 }
238
239 if (files[1] != null) {
240 files[1].delete();
241 }
242 }
243 }
244
245
253 @Override
254 public void deleteUserGroup(long userGroupId)
255 throws PortalException, SystemException {
256
257 UserGroup userGroup = userGroupPersistence.findByPrimaryKey(
258 userGroupId);
259
260 deleteUserGroup(userGroup);
261 }
262
263
271 @Override
272 public void deleteUserGroup(UserGroup userGroup)
273 throws PortalException, SystemException {
274
275 int count = userLocalService.getUserGroupUsersCount(
276 userGroup.getUserGroupId(), WorkflowConstants.STATUS_APPROVED);
277
278 if (count > 0) {
279 throw new RequiredUserGroupException();
280 }
281
282
283
284 clearUserUserGroups(userGroup.getUserGroupId());
285
286
287
288 Group group = userGroup.getGroup();
289
290 groupLocalService.deleteGroup(group);
291
292
293
294 userGroupGroupRoleLocalService.deleteUserGroupGroupRolesByUserGroupId(
295 userGroup.getUserGroupId());
296
297
298
299 resourceLocalService.deleteResource(
300 userGroup.getCompanyId(), UserGroup.class.getName(),
301 ResourceConstants.SCOPE_INDIVIDUAL, userGroup.getUserGroupId());
302
303
304
305 userGroupPersistence.remove(userGroup);
306
307
308
309 PermissionCacheUtil.clearCache();
310 }
311
312
321 @Override
322 public UserGroup getUserGroup(long userGroupId)
323 throws PortalException, SystemException {
324
325 return userGroupPersistence.findByPrimaryKey(userGroupId);
326 }
327
328
337 public UserGroup getUserGroup(long companyId, String name)
338 throws PortalException, SystemException {
339
340 return userGroupPersistence.findByC_N(companyId, name);
341 }
342
343
350 public List<UserGroup> getUserGroups(long companyId)
351 throws SystemException {
352
353 return userGroupPersistence.findByCompanyId(companyId);
354 }
355
356
364 public List<UserGroup> getUserGroups(long[] userGroupIds)
365 throws PortalException, SystemException {
366
367 List<UserGroup> userGroups = new ArrayList<UserGroup>(
368 userGroupIds.length);
369
370 for (long userGroupId : userGroupIds) {
371 UserGroup userGroup = getUserGroup(userGroupId);
372
373 userGroups.add(userGroup);
374 }
375
376 return userGroups;
377 }
378
379
386 public List<UserGroup> getUserUserGroups(long userId)
387 throws SystemException {
388
389 return userPersistence.getUserGroups(userId);
390 }
391
392
401 public boolean hasGroupUserGroup(long groupId, long userGroupId)
402 throws SystemException {
403
404 return groupPersistence.containsUserGroup(groupId, userGroupId);
405 }
406
407
416 public boolean hasTeamUserGroup(long teamId, long userGroupId)
417 throws SystemException {
418
419 return teamPersistence.containsUserGroup(teamId, userGroupId);
420 }
421
422
452 public List<UserGroup> search(
453 long companyId, String name, String description,
454 LinkedHashMap<String, Object> params, int start, int end,
455 OrderByComparator obc)
456 throws SystemException {
457
458 return userGroupFinder.findByC_N_D(
459 companyId, name, description, params, start, end, obc);
460 }
461
462
476 public int searchCount(
477 long companyId, String name, String description,
478 LinkedHashMap<String, Object> params)
479 throws SystemException {
480
481 return userGroupFinder.countByC_N_D(
482 companyId, name, description, params);
483 }
484
485
495 public void setUserUserGroups(long userId, long[] userGroupIds)
496 throws PortalException, SystemException {
497
498 copyUserGroupLayouts(userGroupIds, userId);
499
500 userPersistence.setUserGroups(userId, userGroupIds);
501
502 Indexer indexer = IndexerRegistryUtil.getIndexer(User.class);
503
504 indexer.reindex(userId);
505
506 PermissionCacheUtil.clearCache();
507 }
508
509
516 public void unsetGroupUserGroups(long groupId, long[] userGroupIds)
517 throws SystemException {
518
519 List<Team> teams = teamPersistence.findByGroupId(groupId);
520
521 for (Team team : teams) {
522 teamPersistence.removeUserGroups(team.getTeamId(), userGroupIds);
523 }
524
525 userGroupGroupRoleLocalService.deleteUserGroupGroupRoles(
526 userGroupIds, groupId);
527
528 groupPersistence.removeUserGroups(groupId, userGroupIds);
529
530 PermissionCacheUtil.clearCache();
531 }
532
533
540 public void unsetTeamUserGroups(long teamId, long[] userGroupIds)
541 throws SystemException {
542
543 teamPersistence.removeUserGroups(teamId, userGroupIds);
544
545 PermissionCacheUtil.clearCache();
546 }
547
548
560 public UserGroup updateUserGroup(
561 long companyId, long userGroupId, String name, String description)
562 throws PortalException, SystemException {
563
564 validate(userGroupId, companyId, name);
565
566 UserGroup userGroup = userGroupPersistence.findByPrimaryKey(
567 userGroupId);
568
569 userGroup.setName(name);
570 userGroup.setDescription(description);
571
572 userGroupPersistence.update(userGroup, false);
573
574 return userGroup;
575 }
576
577 protected File[] exportLayouts(
578 long userGroupId, Map<String, String[]> parameterMap)
579 throws PortalException, SystemException {
580
581 File[] files = new File[2];
582
583 UserGroup userGroup = userGroupPersistence.findByPrimaryKey(
584 userGroupId);
585
586 Group group = userGroup.getGroup();
587
588 if (userGroup.hasPrivateLayouts()) {
589 files[0] = layoutLocalService.exportLayoutsAsFile(
590 group.getGroupId(), true, null, parameterMap, null, null);
591 }
592
593 if (userGroup.hasPublicLayouts()) {
594 files[1] = layoutLocalService.exportLayoutsAsFile(
595 group.getGroupId(), false, null, parameterMap, null, null);
596 }
597
598 return files;
599 }
600
601 protected Map<String, String[]> getLayoutTemplatesParameters() {
602 Map<String, String[]> parameterMap =
603 new LinkedHashMap<String, String[]>();
604
605 parameterMap.put(
606 PortletDataHandlerKeys.CATEGORIES,
607 new String[] {Boolean.TRUE.toString()});
608 parameterMap.put(
609 PortletDataHandlerKeys.DATA_STRATEGY,
610 new String[] {PortletDataHandlerKeys.DATA_STRATEGY_MIRROR});
611 parameterMap.put(
612 PortletDataHandlerKeys.DELETE_MISSING_LAYOUTS,
613 new String[] {Boolean.FALSE.toString()});
614 parameterMap.put(
615 PortletDataHandlerKeys.DELETE_PORTLET_DATA,
616 new String[] {Boolean.FALSE.toString()});
617 parameterMap.put(
618 PortletDataHandlerKeys.LAYOUTS_IMPORT_MODE,
619 new String[] {PortletDataHandlerKeys.
620 LAYOUTS_IMPORT_MODE_CREATED_FROM_PROTOTYPE});
621 parameterMap.put(
622 PortletDataHandlerKeys.PERMISSIONS,
623 new String[] {Boolean.TRUE.toString()});
624 parameterMap.put(
625 PortletDataHandlerKeys.PORTLET_DATA,
626 new String[] {Boolean.TRUE.toString()});
627 parameterMap.put(
628 PortletDataHandlerKeys.PORTLET_DATA_ALL,
629 new String[] {Boolean.TRUE.toString()});
630 parameterMap.put(
631 PortletDataHandlerKeys.PORTLET_SETUP,
632 new String[] {Boolean.TRUE.toString()});
633 parameterMap.put(
634 PortletDataHandlerKeys.PORTLET_USER_PREFERENCES,
635 new String[] {Boolean.TRUE.toString()});
636 parameterMap.put(
637 PortletDataHandlerKeys.PORTLETS_MERGE_MODE,
638 new String[] {PortletDataHandlerKeys.
639 PORTLETS_MERGE_MODE_ADD_TO_BOTTOM});
640 parameterMap.put(
641 PortletDataHandlerKeys.THEME,
642 new String[] {Boolean.FALSE.toString()});
643 parameterMap.put(
644 PortletDataHandlerKeys.THEME_REFERENCE,
645 new String[] {Boolean.TRUE.toString()});
646 parameterMap.put(
647 PortletDataHandlerKeys.UPDATE_LAST_PUBLISH_DATE,
648 new String[] {Boolean.FALSE.toString()});
649 parameterMap.put(
650 PortletDataHandlerKeys.USER_ID_STRATEGY,
651 new String[] {UserIdStrategy.CURRENT_USER_ID});
652 parameterMap.put(
653 PortletDataHandlerKeys.USER_PERMISSIONS,
654 new String[] {Boolean.FALSE.toString()});
655
656 return parameterMap;
657 }
658
659 protected void importLayouts(
660 long userId, Map<String, String[]> parameterMap,
661 File privateLayoutsFile, File publicLayoutsFile)
662 throws PortalException, SystemException {
663
664 User user = userPersistence.findByPrimaryKey(userId);
665
666 long groupId = user.getGroup().getGroupId();
667
668 if (privateLayoutsFile != null) {
669 layoutLocalService.importLayouts(
670 userId, groupId, true, parameterMap, privateLayoutsFile);
671 }
672
673 if (publicLayoutsFile != null) {
674 layoutLocalService.importLayouts(
675 userId, groupId, false, parameterMap, publicLayoutsFile);
676 }
677 }
678
679 protected void validate(long userGroupId, long companyId, String name)
680 throws PortalException, SystemException {
681
682 if ((Validator.isNull(name)) ||
683 (name.indexOf(CharPool.COMMA) != -1) ||
684 (name.indexOf(CharPool.STAR) != -1)) {
685
686 throw new UserGroupNameException();
687 }
688
689 if (Validator.isNumber(name) &&
690 !PropsValues.USER_GROUPS_NAME_ALLOW_NUMERIC) {
691
692 throw new UserGroupNameException();
693 }
694
695 try {
696 UserGroup userGroup = userGroupFinder.findByC_N(companyId, name);
697
698 if (userGroup.getUserGroupId() != userGroupId) {
699 throw new DuplicateUserGroupException();
700 }
701 }
702 catch (NoSuchUserGroupException nsuge) {
703 }
704 }
705
706 }