001/** 002 * Copyright 2005-2015 The Kuali Foundation 003 * 004 * Licensed under the Educational Community License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.opensource.org/licenses/ecl2.php 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016package org.kuali.rice.kim.impl.group; 017 018import org.apache.commons.collections.ListUtils; 019import org.apache.commons.lang.StringUtils; 020import org.kuali.rice.kew.api.KewApiServiceLocator; 021import org.kuali.rice.kew.api.KewApiConstants; 022import org.kuali.rice.kim.api.group.GroupService; 023import org.kuali.rice.kim.api.services.KimApiServiceLocator; 024import org.kuali.rice.krad.service.BusinessObjectService; 025import org.kuali.rice.krad.service.KRADServiceLocator; 026 027import java.util.ArrayList; 028import java.util.Collections; 029import java.util.HashSet; 030import java.util.List; 031import java.util.Set; 032 033/** 034 * Concrete Implementation of {@link GroupInternalService} 035 * 036 * @author Kuali Rice Team (rice.collab@kuali.org) 037 * 038 */ 039public class GroupInternalServiceImpl implements GroupInternalService { 040 protected BusinessObjectService getBusinessObjectService() { 041 return KRADServiceLocator.getBusinessObjectService(); 042 } 043 044 045 public GroupService getGroupService(){ 046 return KimApiServiceLocator.getGroupService(); 047 } 048 049 @Override 050 public GroupBo saveWorkgroup(GroupBo group) { 051 GroupService ims = getGroupService(); 052 List<String> oldIds = Collections.emptyList(); 053 if (StringUtils.isNotEmpty(group.getId())) { 054 oldIds = ims.getMemberPrincipalIds(group.getId()); 055 } 056 group = (GroupBo)getBusinessObjectService().save( group ); 057 List<String> newIds = ims.getMemberPrincipalIds(group.getId()); 058 updateForWorkgroupChange(group.getId(), oldIds, newIds); 059 return group; 060 } 061 062 @Override 063 public void updateForWorkgroupChange(String groupId, 064 List<String> oldPrincipalIds, List<String> newPrincipalIds) { 065 MembersDiff membersDiff = getMembersDiff(oldPrincipalIds, newPrincipalIds); 066 for (String removedPrincipalId : membersDiff.getRemovedPrincipalIds()) { 067 updateForUserRemovedFromGroup(removedPrincipalId, groupId); 068 } 069 for (String addedPrincipalId : membersDiff.getAddedPrincipalIds()) { 070 updateForUserAddedToGroup(addedPrincipalId, groupId); 071 } 072 } 073 074 @Override 075 public void updateForUserAddedToGroup(String principalId, String groupId) { 076 // first verify that the user is still a member of the workgroup 077 if(getGroupService().isMemberOfGroup(principalId, groupId)) 078 { 079 KewApiServiceLocator.getGroupMembershipChangeQueue() 080 .notifyMembershipChange(KewApiConstants.GroupMembershipChangeOperations.ADDED, groupId, principalId); 081 } 082 } 083 084 @Override 085 public void updateForUserRemovedFromGroup(String principalId, String groupId) { 086 // first verify that the user is no longer a member of the workgroup 087 if(!getGroupService().isMemberOfGroup(principalId, groupId)) 088 { 089 KewApiServiceLocator.getGroupMembershipChangeQueue() 090 .notifyMembershipChange(KewApiConstants.GroupMembershipChangeOperations.REMOVED, groupId, principalId); 091 } 092 093 } 094 095 private MembersDiff getMembersDiff(List<String> oldMemberPrincipalIds, List<String> newMemberPrincipalIds) { 096 097 // ListUtils does not check the null case. Which can happen when adding a new group 098 // so, if they're null make them empty lists. 099 if(oldMemberPrincipalIds == null) oldMemberPrincipalIds = new ArrayList<String>(); 100 if(newMemberPrincipalIds == null) newMemberPrincipalIds = new ArrayList<String>(); 101 102 Set<String> addedPrincipalIds = new HashSet<String>(ListUtils.subtract(newMemberPrincipalIds, oldMemberPrincipalIds)); 103 Set<String> removedPrincipalIds = new HashSet<String>(ListUtils.subtract(oldMemberPrincipalIds, newMemberPrincipalIds)); 104 return new MembersDiff(addedPrincipalIds, removedPrincipalIds); 105 } 106 107 private class MembersDiff { 108 private final Set<String> addedPrincipalIds; 109 110 private final Set<String> removedPrincipalIds; 111 112 public MembersDiff(Set<String> addedPrincipalIds, Set<String>removedPrincipalIds) { 113 this.addedPrincipalIds = addedPrincipalIds; 114 this.removedPrincipalIds = removedPrincipalIds; 115 } 116 117 public Set<String> getAddedPrincipalIds() { 118 return addedPrincipalIds; 119 } 120 121 public Set<String> getRemovedPrincipalIds() { 122 return removedPrincipalIds; 123 } 124 } 125 126}