001 /**
002 * Copyright 2005-2013 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 */
016 package org.kuali.rice.kim.impl.responsibility;
017
018 import org.kuali.rice.kew.api.KewApiServiceLocator;
019 import org.kuali.rice.kim.api.KimConstants;
020 import org.kuali.rice.kim.api.responsibility.Responsibility;
021 import org.kuali.rice.kim.api.responsibility.ResponsibilityService;
022 import org.kuali.rice.kim.api.role.RoleResponsibility;
023 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
024 import org.kuali.rice.kim.impl.common.delegate.DelegateMemberBo;
025 import org.kuali.rice.kim.impl.role.RoleMemberBo;
026 import org.kuali.rice.kim.impl.role.RoleResponsibilityBo;
027 import org.kuali.rice.krad.service.BusinessObjectService;
028 import org.kuali.rice.krad.service.KRADServiceLocator;
029
030 import java.util.ArrayList;
031 import java.util.Collections;
032 import java.util.HashSet;
033 import java.util.List;
034 import java.util.Map;
035 import java.util.Set;
036
037 public class ResponsibilityInternalServiceImpl implements ResponsibilityInternalService {
038
039 private BusinessObjectService businessObjectService;
040 private ResponsibilityService responsibilityService;
041
042 @Override
043 public RoleMemberBo saveRoleMember(RoleMemberBo roleMember){
044
045 //need to find what responsibilities changed so we can notify interested clients. Like workflow.
046 List<RoleResponsibility> oldRoleResp = getRoleResponsibilities(roleMember.getRoleId());
047
048 // add row to member table
049 RoleMemberBo member = getBusinessObjectService().save( roleMember );
050
051 //need to find what responsibilities changed so we can notify interested clients. Like workflow.
052 // the new member has been added
053 List<RoleResponsibility> newRoleResp = getRoleResponsibilities(roleMember.getRoleId());
054
055 updateActionRequestsForResponsibilityChange(getChangedRoleResponsibilityIds(oldRoleResp, newRoleResp));
056
057 return member;
058 }
059
060 @Override
061 public DelegateMemberBo saveDelegateMember(DelegateMemberBo delegateMember) {
062
063 // add row to member table
064 DelegateMemberBo member = getBusinessObjectService().save(delegateMember);
065
066 return member;
067 }
068
069 @Override
070 public void removeRoleMember(RoleMemberBo roleMember){
071 //need to find what responsibilities changed so we can notify interested clients. Like workflow.
072 List<RoleResponsibility> oldRoleResp = getRoleResponsibilities(roleMember.getRoleId());
073
074 // need to set end date to inactivate, not delete
075 roleMember.setActiveToDateValue(new java.sql.Timestamp(System.currentTimeMillis()));
076 getBusinessObjectService().save( roleMember );
077
078 //need to find what responsibilities changed so we can notify interested clients. Like workflow.
079 // the new member has been added
080 List<RoleResponsibility> newRoleResp = getRoleResponsibilities(roleMember.getRoleId());
081
082 updateActionRequestsForResponsibilityChange(getChangedRoleResponsibilityIds(oldRoleResp, newRoleResp));
083 }
084
085 @Override
086 @SuppressWarnings("unchecked")
087 public void updateActionRequestsForRoleChange(String roleId) {
088 List<RoleResponsibility> newRoleResp = getRoleResponsibilities(roleId);
089
090 updateActionRequestsForResponsibilityChange(getChangedRoleResponsibilityIds(Collections.EMPTY_LIST, newRoleResp));
091 }
092
093
094 /**
095 * This overridden method ...
096 *
097 * @see ResponsibilityInternalService#updateActionRequestsForResponsibilityChange(java.util.Set)
098 */
099 @Override
100 public void updateActionRequestsForResponsibilityChange(Set<String> responsibilityIds) {
101 KewApiServiceLocator.getResponsibilityChangeQueue().responsibilitiesChanged(responsibilityIds);
102 }
103
104 @SuppressWarnings("unchecked")
105 public List<RoleResponsibility> getRoleResponsibilities(String roleId){
106 List<RoleResponsibilityBo> rrBoList =
107 (List<RoleResponsibilityBo>)getBusinessObjectService()
108 .findMatching(RoleResponsibilityBo.class, Collections.singletonMap(KimConstants.PrimaryKeyConstants.SUB_ROLE_ID, roleId));
109 List<RoleResponsibility> result = new ArrayList<RoleResponsibility>( rrBoList.size() );
110 for ( RoleResponsibilityBo bo : rrBoList ) {
111 result.add( RoleResponsibilityBo.to(bo) );
112 }
113 return result;
114 }
115
116 /**
117 *
118 * This method compares the two lists of responsibilitiy IDs and does a union. returns a unique list of responsibility ids.
119 *
120 * @param oldRespList
121 * @param newRespList
122 * @return
123 */
124 protected Set<String> getChangedRoleResponsibilityIds(
125 List<RoleResponsibility> oldRespList,
126 List<RoleResponsibility> newRespList) {
127 Set<String> lRet = new HashSet<String>();
128
129 for (RoleResponsibility resp : oldRespList) {
130 lRet.add(resp.getResponsibilityId());
131 }
132 for (RoleResponsibility resp : newRespList) {
133 lRet.add(resp.getResponsibilityId());
134 }
135
136 return lRet;
137 }
138
139 protected BusinessObjectService getBusinessObjectService() {
140 if ( businessObjectService == null ) {
141 businessObjectService = KRADServiceLocator.getBusinessObjectService();
142 }
143 return businessObjectService;
144 }
145
146 protected ResponsibilityService getResponsibilityService() {
147 if ( responsibilityService == null ) {
148 responsibilityService = KimApiServiceLocator.getResponsibilityService();
149 }
150 return responsibilityService;
151 }
152
153 @Override
154 public boolean areActionsAtAssignmentLevel(Responsibility responsibility ) {
155 Map<String, String> details = responsibility.getAttributes();
156 if ( details == null ) {
157 return false;
158 }
159 String actionDetailsAtRoleMemberLevel = details.get( KimConstants.AttributeConstants.ACTION_DETAILS_AT_ROLE_MEMBER_LEVEL );
160 return Boolean.valueOf(actionDetailsAtRoleMemberLevel);
161 }
162
163 @Override
164 public boolean areActionsAtAssignmentLevelById( String responsibilityId ) {
165 Responsibility responsibility = getResponsibilityService().getResponsibility(responsibilityId);
166 if ( responsibility == null ) {
167 return false;
168 }
169 return areActionsAtAssignmentLevel(responsibility);
170 }
171
172 }