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 org.apache.commons.lang.StringUtils;
019import org.joda.time.DateTime;
020import org.kuali.rice.kim.api.group.GroupMember;
021import org.kuali.rice.kim.impl.common.delegate.DelegateMemberBo;
022import org.kuali.rice.kim.impl.common.delegate.DelegateTypeBo;
023import org.kuali.rice.kim.impl.group.GroupMemberBo;
024
025import java.sql.Timestamp;
026import java.util.ArrayList;
027import java.util.HashSet;
028import java.util.List;
029import java.util.Set;
030import java.util.concurrent.TimeUnit;
031
032public class RoleInternalServiceImpl extends RoleServiceBase implements RoleInternalService{
033    @Override
034    public void principalInactivated(String principalId) {
035        if (StringUtils.isBlank(principalId)) {
036            throw new IllegalArgumentException("principalId is null or blank");
037        }
038
039        long oneDayInMillis = TimeUnit.DAYS.toMillis(1);
040        Timestamp yesterday = new Timestamp(System.currentTimeMillis() - oneDayInMillis);
041
042        inactivatePrincipalRoleMemberships(principalId, yesterday);
043        inactivatePrincipalGroupMemberships(principalId, yesterday);
044        inactivatePrincipalDelegations(principalId, yesterday);
045        inactivateApplicationRoleMemberships(principalId, yesterday);
046    }
047
048    @Override
049    public void roleInactivated(String roleId) {
050        if (StringUtils.isBlank(roleId)) {
051            throw new IllegalArgumentException("roleId is null or blank");
052        }
053
054        long oneDayInMillis = TimeUnit.DAYS.toMillis(1);
055        Timestamp yesterday = new Timestamp(System.currentTimeMillis() - oneDayInMillis);
056
057        List<String> roleIds = new ArrayList<String>();
058        roleIds.add(roleId);
059        inactivateRoleMemberships(roleIds, yesterday);
060        inactivateRoleDelegations(roleIds, yesterday);
061        inactivateMembershipsForRoleAsMember(roleIds, yesterday);
062    }
063
064    private void inactivateRoleMemberships(List<String> roleIds, Timestamp yesterday) {
065        List<RoleMemberBo> roleMemberBoList = getStoredRoleMembersForRoleIds(roleIds, null, null);
066        for (RoleMemberBo roleMemberBo : roleMemberBoList) {
067            roleMemberBo.setActiveToDateValue(yesterday);
068        }
069        getBusinessObjectService().save(roleMemberBoList);
070    }
071
072    private void inactivateRoleDelegations(List<String> roleIds, Timestamp yesterday) {
073        List<DelegateTypeBo> delegations = getStoredDelegationImplsForRoleIds(roleIds);
074        for (DelegateTypeBo delegation : delegations) {
075            delegation.setActive(false);
076            for (DelegateMemberBo delegationMember : delegation.getMembers()) {
077                delegationMember.setActiveToDateValue(yesterday);
078            }
079        }
080        getBusinessObjectService().save(delegations);
081    }
082
083    private void inactivateMembershipsForRoleAsMember(List<String> roleIds, Timestamp yesterday) {
084        List<RoleMemberBo> roleMemberBoList = getStoredRoleMembershipsForRoleIdsAsMembers(roleIds, null);
085        for (RoleMemberBo roleMemberBo : roleMemberBoList) {
086            roleMemberBo.setActiveToDateValue(yesterday);
087        }
088        getBusinessObjectService().save(roleMemberBoList);
089    }
090
091    @Override
092    public void groupInactivated(String groupId) {
093        if (StringUtils.isBlank(groupId)) {
094            throw new IllegalArgumentException("groupId is null or blank");
095        }
096
097        long oneDayInMillis = TimeUnit.DAYS.toMillis(1);
098        Timestamp yesterday = new Timestamp(System.currentTimeMillis() - oneDayInMillis);
099
100        List<String> groupIds = new ArrayList<String>();
101        groupIds.add(groupId);
102        inactivatePrincipalGroupMemberships(groupIds, yesterday);
103        inactivateGroupRoleMemberships(groupIds, yesterday);
104    }
105
106    protected void inactivateApplicationRoleMemberships(String principalId, Timestamp yesterday) {
107
108    }
109
110    protected void inactivatePrincipalRoleMemberships(String principalId, Timestamp yesterday) {
111        // go through all roles and post-date them
112        List<RoleMemberBo> roleMembers = getStoredRolePrincipalsForPrincipalIdAndRoleIds(null, principalId, null);
113        Set<String> roleIds = new HashSet<String>(roleMembers.size());
114        for (RoleMemberBo roleMemberBo : roleMembers) {
115            roleMemberBo.setActiveToDateValue(yesterday);
116            roleIds.add(roleMemberBo.getRoleId()); // add to the set of IDs
117        }
118        getBusinessObjectService().save(roleMembers);
119    }
120
121    protected void inactivateGroupRoleMemberships(List<String> groupIds, Timestamp yesterday) {
122        List<RoleMemberBo> roleMemberBosOfGroupType = getStoredRoleGroupsForGroupIdsAndRoleIds(null, groupIds, null);
123        for (RoleMemberBo roleMemberbo : roleMemberBosOfGroupType) {
124            roleMemberbo.setActiveToDateValue(yesterday);
125        }
126        getBusinessObjectService().save(roleMemberBosOfGroupType);
127    }
128
129    protected void inactivatePrincipalGroupMemberships(String principalId, Timestamp yesterday) {
130        List<GroupMember> groupMembers = getRoleDao().getGroupPrincipalsForPrincipalIdAndGroupIds(null, principalId);
131        List<GroupMemberBo> groupMemberBoList = new ArrayList<GroupMemberBo>(groupMembers.size());
132        for (GroupMember gm : groupMembers) {
133            GroupMember.Builder builder = GroupMember.Builder.create(gm);
134            builder.setActiveToDate(new DateTime(yesterday.getTime()));
135            groupMemberBoList.add(GroupMemberBo.from(builder.build()));
136        }
137        getBusinessObjectService().save(groupMemberBoList);
138    }
139
140    protected void inactivatePrincipalGroupMemberships(List<String> groupIds, Timestamp yesterday) {
141        List<GroupMember> groupMembers = getRoleDao().getGroupMembers(groupIds);
142        List<GroupMemberBo> groupMemberBoList = new ArrayList<GroupMemberBo>(groupMembers.size());
143        for (GroupMember groupMember : groupMembers) {
144            GroupMember.Builder builder = GroupMember.Builder.create(groupMember);
145            builder.setActiveToDate(new DateTime(yesterday.getTime()));
146            groupMemberBoList.add(GroupMemberBo.from(builder.build()));
147        }
148        getBusinessObjectService().save(groupMemberBoList);
149    }
150
151    protected void inactivatePrincipalDelegations(String principalId, Timestamp yesterday) {
152        List<DelegateMemberBo> delegationMembers = getStoredDelegationPrincipalsForPrincipalIdAndDelegationIds(null,
153                principalId);
154        for (DelegateMemberBo delegateMemberBo : delegationMembers) {
155            delegateMemberBo.setActiveToDateValue(yesterday);
156        }
157        getBusinessObjectService().save(delegationMembers);
158    }
159}