001/** 002 * Copyright 2005-2016 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.role; 017 018import java.sql.Timestamp; 019import java.util.ArrayList; 020import java.util.Collection; 021import java.util.HashSet; 022import java.util.List; 023import java.util.Set; 024import java.util.concurrent.TimeUnit; 025 026import org.apache.commons.lang.StringUtils; 027import org.joda.time.DateTime; 028import org.kuali.rice.core.api.membership.MemberType; 029import org.kuali.rice.kim.api.group.GroupMember; 030import org.kuali.rice.kim.impl.common.delegate.DelegateMemberBo; 031import org.kuali.rice.kim.impl.common.delegate.DelegateTypeBo; 032import org.kuali.rice.kim.impl.group.GroupMemberBo; 033 034public class RoleInternalServiceImpl extends RoleServiceBase implements RoleInternalService{ 035 @Override 036 public void principalInactivated(String principalId) { 037 if (StringUtils.isBlank(principalId)) { 038 throw new IllegalArgumentException("principalId is null or blank"); 039 } 040 041 long oneDayInMillis = TimeUnit.DAYS.toMillis(1); 042 Timestamp yesterday = new Timestamp(System.currentTimeMillis() - oneDayInMillis); 043 044 inactivatePrincipalRoleMemberships(principalId, yesterday); 045 inactivatePrincipalGroupMemberships(principalId, yesterday); 046 inactivatePrincipalDelegations(principalId, yesterday); 047 inactivateApplicationRoleMemberships(principalId, yesterday); 048 } 049 050 @Override 051 public void roleInactivated(String roleId) { 052 if (StringUtils.isBlank(roleId)) { 053 throw new IllegalArgumentException("roleId is null or blank"); 054 } 055 056 long oneDayInMillis = TimeUnit.DAYS.toMillis(1); 057 Timestamp yesterday = new Timestamp(System.currentTimeMillis() - oneDayInMillis); 058 059 List<String> roleIds = new ArrayList<String>(); 060 roleIds.add(roleId); 061 inactivateRoleMemberships(roleIds, yesterday); 062 inactivateRoleDelegations(roleIds, yesterday); 063 inactivateMembershipsForRoleAsMember(roleIds, yesterday); 064 } 065 066 private void inactivateRoleMemberships(List<String> roleIds, Timestamp yesterday) { 067 List<RoleMemberBo> roleMemberBoList = getStoredRoleMembersForRoleIds(roleIds, null, null); 068 for (RoleMemberBo roleMemberBo : roleMemberBoList) { 069 roleMemberBo.setActiveToDateValue(yesterday); 070 // Notify the role type service that the member was removed 071 notifyOnMemberRemoval(RoleMemberBo.to(roleMemberBo)); 072 getDataObjectService().save(roleMemberBo); 073 } 074 075 } 076 077 private void inactivateRoleDelegations(List<String> roleIds, Timestamp yesterday) { 078 List<DelegateTypeBo> delegations = getStoredDelegationImplsForRoleIds(roleIds); 079 for (DelegateTypeBo delegation : delegations) { 080 delegation.setActive(false); 081 for (DelegateMemberBo delegationMember : delegation.getMembers()) { 082 delegationMember.setActiveToDateValue(yesterday); 083 getDataObjectService().save(delegationMember); 084 } 085 } 086 } 087 088 private void inactivateMembershipsForRoleAsMember(List<String> roleIds, Timestamp yesterday) { 089 List<RoleMemberBo> roleMemberBoList = getStoredRoleMembershipsForRoleIdsAsMembers(roleIds, null); 090 for (RoleMemberBo roleMemberBo : roleMemberBoList) { 091 roleMemberBo.setActiveToDateValue(yesterday); 092 // Notify the role type service that the member was removed 093 notifyOnMemberRemoval(RoleMemberBo.to(roleMemberBo)); 094 getDataObjectService().save(roleMemberBo); 095 } 096 } 097 098 @Override 099 public void groupInactivated(String groupId) { 100 if (StringUtils.isBlank(groupId)) { 101 throw new IllegalArgumentException("groupId is null or blank"); 102 } 103 104 long oneDayInMillis = TimeUnit.DAYS.toMillis(1); 105 Timestamp yesterday = new Timestamp(System.currentTimeMillis() - oneDayInMillis); 106 107 List<String> groupIds = new ArrayList<String>(); 108 groupIds.add(groupId); 109 inactivatePrincipalGroupMemberships(groupIds, yesterday); 110 inactivateGroupRoleMemberships(groupIds, yesterday); 111 } 112 113 protected void inactivateApplicationRoleMemberships(String principalId, Timestamp yesterday) { 114 115 } 116 117 protected void inactivatePrincipalRoleMemberships(String principalId, Timestamp yesterday) { 118 // go through all roles and post-date them 119 List<RoleMemberBo> roleMembers = getStoredRolePrincipalsForPrincipalIdAndRoleIds(null, principalId, null); 120 Set<String> roleIds = new HashSet<String>(roleMembers.size()); 121 for (RoleMemberBo roleMemberBo : roleMembers) { 122 roleMemberBo.setActiveToDateValue(yesterday); 123 roleIds.add(roleMemberBo.getRoleId()); // add to the set of IDs 124 // Notify the role type service that the member was removed 125 notifyOnMemberRemoval(RoleMemberBo.to(roleMemberBo)); 126 getDataObjectService().save(roleMemberBo); 127 } 128 } 129 130 protected void inactivateGroupRoleMemberships(List<String> groupIds, Timestamp yesterday) { 131 List<RoleMemberBo> roleMemberBosOfGroupType = getStoredRoleGroupsForGroupIdsAndRoleIds(null, groupIds, null); 132 for (RoleMemberBo roleMemberBo : roleMemberBosOfGroupType) { 133 roleMemberBo.setActiveToDateValue(yesterday); 134 // Notify the role type service that the member was removed 135 notifyOnMemberRemoval(RoleMemberBo.to(roleMemberBo)); 136 getDataObjectService().save(roleMemberBo); 137 } 138 } 139 140 protected void inactivatePrincipalGroupMemberships(String principalId, Timestamp yesterday) { 141 if ( StringUtils.isBlank(principalId) ) { 142 return; 143 } 144 // get all the groups the person is in 145 List<String> groupIds = getGroupService().getGroupIdsByPrincipalId(principalId); 146 if (groupIds.isEmpty() ) { 147 return; 148 } 149 // get all the member records for those groups 150 Collection<GroupMember> groupMembers = getGroupService().getMembers(groupIds); 151 List<GroupMember> groupPrincipals = new ArrayList<GroupMember>(groupMembers.size()); 152 for (GroupMember groupMembershipInfo : groupMembers) { 153 if (MemberType.PRINCIPAL.equals(groupMembershipInfo.getType()) 154 && StringUtils.equals(principalId, groupMembershipInfo.getMemberId()) 155 && groupMembershipInfo.isActive(new DateTime())) { 156 groupPrincipals.add(groupMembershipInfo); 157 // FIXME: Is there a reason we are not calling the responsible group service? 158 //getGroupService().removePrincipalFromGroup(groupMembershipInfo.getMemberId(), groupMembershipInfo.getGroupId()); 159 } 160 } 161 // FIXME: Is there a reason we are doing this directly and *not* calling the group service??? 162 for (GroupMember gm : groupPrincipals) { 163 GroupMember.Builder builder = GroupMember.Builder.create(gm); 164 builder.setActiveToDate(new DateTime(yesterday.getTime())); 165 getDataObjectService().save(GroupMemberBo.from(builder.build())); 166 } 167 } 168 169 protected void inactivatePrincipalGroupMemberships(List<String> groupIds, Timestamp yesterday) { 170 if (groupIds == null || groupIds.isEmpty() ) { 171 return; 172 } 173 Collection<GroupMember> groupMemberships = getGroupService().getMembers(groupIds); 174 if ( groupMemberships.isEmpty() ) { 175 return; 176 } 177 List<GroupMember> groupMembers = new ArrayList<GroupMember>(); 178 for (GroupMember groupMembershipInfo : groupMemberships) { 179 if (MemberType.GROUP.equals(groupMembershipInfo.getType()) 180 && groupMembershipInfo.isActive(new DateTime())) { 181 groupMembers.add(groupMembershipInfo); 182 } 183 } 184 // FIXME: Is there a reason we are doing this directly and *not* calling the group service??? 185 for (GroupMember groupMember : groupMembers) { 186 GroupMember.Builder builder = GroupMember.Builder.create(groupMember); 187 builder.setActiveToDate(new DateTime(yesterday.getTime())); 188 getDataObjectService().save(GroupMemberBo.from(builder.build())); 189 } 190 } 191 192 protected void inactivatePrincipalDelegations(String principalId, Timestamp yesterday) { 193 List<DelegateMemberBo> delegationMembers = getStoredDelegationPrincipalsForPrincipalIdAndDelegationIds(null, 194 principalId); 195 for (DelegateMemberBo delegateMemberBo : delegationMembers) { 196 delegateMemberBo.setActiveToDateValue(yesterday); 197 getDataObjectService().save(delegateMemberBo); 198 } 199 } 200}