|  1 |     | 
     | 
  |  2 |     | 
     | 
  |  3 |     | 
     | 
  |  4 |     | 
     | 
  |  5 |     | 
     | 
  |  6 |     | 
     | 
  |  7 |     | 
     | 
  |  8 |     | 
     | 
  |  9 |     | 
     | 
  |  10 |     | 
     | 
  |  11 |     | 
     | 
  |  12 |     | 
     | 
  |  13 |     | 
     | 
  |  14 |     | 
     | 
  |  15 |     | 
     | 
  |  16 |     | 
   package org.kuali.rice.kim.service.impl;  | 
  |  17 |     | 
     | 
  |  18 |     | 
   import java.sql.Date;  | 
  |  19 |     | 
   import java.sql.Timestamp;  | 
  |  20 |     | 
   import java.util.ArrayList;  | 
  |  21 |     | 
   import java.util.Collection;  | 
  |  22 |     | 
   import java.util.Collections;  | 
  |  23 |     | 
   import java.util.HashMap;  | 
  |  24 |     | 
   import java.util.HashSet;  | 
  |  25 |     | 
   import java.util.List;  | 
  |  26 |     | 
   import java.util.ListIterator;  | 
  |  27 |     | 
   import java.util.Map;  | 
  |  28 |     | 
   import java.util.Set;  | 
  |  29 |     | 
     | 
  |  30 |     | 
   import javax.jws.WebParam;  | 
  |  31 |     | 
   import javax.jws.WebService;  | 
  |  32 |     | 
     | 
  |  33 |     | 
   import org.apache.commons.collections.CollectionUtils;  | 
  |  34 |     | 
   import org.apache.commons.lang.StringUtils;  | 
  |  35 |     | 
   import org.apache.log4j.Logger;  | 
  |  36 |     | 
   import org.kuali.rice.core.xml.dto.AttributeSet;  | 
  |  37 |     | 
   import org.kuali.rice.kim.bo.Role;  | 
  |  38 |     | 
   import org.kuali.rice.kim.bo.group.dto.GroupMembershipInfo;  | 
  |  39 |     | 
   import org.kuali.rice.kim.bo.group.impl.GroupMemberImpl;  | 
  |  40 |     | 
   import org.kuali.rice.kim.bo.impl.RoleImpl;  | 
  |  41 |     | 
   import org.kuali.rice.kim.bo.role.dto.DelegateInfo;  | 
  |  42 |     | 
   import org.kuali.rice.kim.bo.role.dto.DelegateMemberCompleteInfo;  | 
  |  43 |     | 
   import org.kuali.rice.kim.bo.role.dto.DelegateTypeInfo;  | 
  |  44 |     | 
   import org.kuali.rice.kim.bo.role.dto.KimRoleInfo;  | 
  |  45 |     | 
   import org.kuali.rice.kim.bo.role.dto.RoleMembershipInfo;  | 
  |  46 |     | 
   import org.kuali.rice.kim.bo.role.dto.RoleResponsibilityInfo;  | 
  |  47 |     | 
   import org.kuali.rice.kim.bo.role.impl.KimDelegationImpl;  | 
  |  48 |     | 
   import org.kuali.rice.kim.bo.role.impl.KimDelegationMemberImpl;  | 
  |  49 |     | 
   import org.kuali.rice.kim.bo.role.impl.RoleMemberImpl;  | 
  |  50 |     | 
   import org.kuali.rice.kim.bo.role.impl.RoleResponsibilityImpl;  | 
  |  51 |     | 
   import org.kuali.rice.kim.bo.types.dto.KimTypeInfo;  | 
  |  52 |     | 
   import org.kuali.rice.kim.service.KIMServiceLocatorInternal;  | 
  |  53 |     | 
   import org.kuali.rice.kim.service.KIMServiceLocatorWeb;  | 
  |  54 |     | 
   import org.kuali.rice.kim.service.RoleService;  | 
  |  55 |     | 
   import org.kuali.rice.kim.service.support.KimDelegationTypeService;  | 
  |  56 |     | 
   import org.kuali.rice.kim.service.support.KimRoleTypeService;  | 
  |  57 |     | 
   import org.kuali.rice.kim.service.support.KimTypeService;  | 
  |  58 |     | 
   import org.kuali.rice.kim.util.KIMPropertyConstants;  | 
  |  59 |     | 
   import org.kuali.rice.kim.util.KIMWebServiceConstants;  | 
  |  60 |     | 
   import org.kuali.rice.kim.util.KimCommonUtilsInternal;  | 
  |  61 |     | 
   import org.kuali.rice.kim.util.KimConstants;  | 
  |  62 |     | 
     | 
  |  63 |     | 
     | 
  |  64 |     | 
     | 
  |  65 |     | 
     | 
  |  66 |     | 
     | 
  |  67 |     | 
     | 
  |  68 |     | 
     | 
  |  69 |     | 
   @WebService(endpointInterface = KIMWebServiceConstants.RoleService.INTERFACE_CLASS, serviceName = KIMWebServiceConstants.RoleService.WEB_SERVICE_NAME, portName = KIMWebServiceConstants.RoleService.WEB_SERVICE_PORT, targetNamespace = KIMWebServiceConstants.MODULE_TARGET_NAMESPACE)  | 
  |  70 |    0 |    public class RoleServiceImpl extends RoleServiceBase implements RoleService { | 
  |  71 |    0 |            private static final Logger LOG = Logger.getLogger( RoleServiceImpl.class );  | 
  |  72 |     | 
     | 
  |  73 |     | 
             | 
  |  74 |     | 
             | 
  |  75 |     | 
         | 
  |  76 |     | 
         | 
  |  77 |     | 
         | 
  |  78 |     | 
     | 
  |  79 |     | 
         | 
  |  80 |     | 
     | 
  |  81 |     | 
         | 
  |  82 |     | 
     | 
  |  83 |     | 
             | 
  |  84 |     | 
     | 
  |  85 |     | 
     | 
  |  86 |     | 
           public KimRoleInfo getRole(String roleId) { | 
  |  87 |    0 |                    RoleImpl role = getRoleImpl( roleId );  | 
  |  88 |    0 |                    if ( role == null ) { | 
  |  89 |    0 |                            return null;  | 
  |  90 |     | 
                   }  | 
  |  91 |    0 |                    return role.toSimpleInfo();  | 
  |  92 |     | 
           }  | 
  |  93 |     | 
     | 
  |  94 |     | 
             | 
  |  95 |     | 
     | 
  |  96 |     | 
     | 
  |  97 |     | 
           public String getRoleIdByName(String namespaceCode, String roleName) { | 
  |  98 |    0 |                    RoleImpl role = getRoleImplByName( namespaceCode, roleName );  | 
  |  99 |    0 |                    if ( role == null ) { | 
  |  100 |    0 |                            return null;  | 
  |  101 |     | 
                   }  | 
  |  102 |    0 |                    return role.getRoleId();  | 
  |  103 |     | 
           }  | 
  |  104 |     | 
     | 
  |  105 |     | 
             | 
  |  106 |     | 
     | 
  |  107 |     | 
     | 
  |  108 |     | 
           public KimRoleInfo getRoleByName( String namespaceCode, String roleName ) { | 
  |  109 |    0 |                    RoleImpl role = getRoleImplByName( namespaceCode, roleName );  | 
  |  110 |    0 |                    if ( role != null ) { | 
  |  111 |    0 |                            return role.toSimpleInfo();  | 
  |  112 |     | 
                   }  | 
  |  113 |    0 |                    return null;  | 
  |  114 |     | 
           }  | 
  |  115 |     | 
     | 
  |  116 |     | 
             | 
  |  117 |     | 
     | 
  |  118 |     | 
           protected Map<String,RoleImpl> getRoleImplMap(Collection<String> roleIds) { | 
  |  119 |    0 |                    Map<String,RoleImpl> result = null;  | 
  |  120 |     | 
                     | 
  |  121 |    0 |                    if ( roleIds.size() == 1 ) { | 
  |  122 |    0 |                            String roleId = roleIds.iterator().next();  | 
  |  123 |    0 |                            RoleImpl impl = getRoleImpl(roleId);  | 
  |  124 |    0 |                            if ( impl.isActive() ) { | 
  |  125 |    0 |                                    result = Collections.singletonMap(roleId, getRoleImpl(roleId));  | 
  |  126 |     | 
                           } else { | 
  |  127 |    0 |                                    result = Collections.emptyMap();  | 
  |  128 |     | 
                           }                          | 
  |  129 |    0 |                    } else { | 
  |  130 |    0 |                            result = new HashMap<String,RoleImpl>(roleIds.size());  | 
  |  131 |    0 |                            for ( String roleId : roleIds ) { | 
  |  132 |    0 |                                    RoleImpl impl = getRoleImpl(roleId);  | 
  |  133 |    0 |                                    if ( impl.isActive() ) { | 
  |  134 |    0 |                                            result.put(roleId, impl);  | 
  |  135 |     | 
                                   }                                  | 
  |  136 |    0 |                            }  | 
  |  137 |     | 
                   }  | 
  |  138 |    0 |                    return result;  | 
  |  139 |     | 
           }  | 
  |  140 |     | 
     | 
  |  141 |     | 
           public List<KimRoleInfo> getRoles(List<String> roleIds) { | 
  |  142 |    0 |                    Collection<RoleImpl> roles = getRoleImplMap(roleIds).values();  | 
  |  143 |    0 |                    List<KimRoleInfo> roleInfos = new ArrayList<KimRoleInfo>( roles.size() );  | 
  |  144 |    0 |                    for ( RoleImpl r : roles ) { | 
  |  145 |    0 |                            roleInfos.add( r.toSimpleInfo() );  | 
  |  146 |     | 
                   }  | 
  |  147 |    0 |                    return roleInfos;  | 
  |  148 |     | 
           }  | 
  |  149 |     | 
     | 
  |  150 |     | 
     | 
  |  151 |     | 
           @SuppressWarnings("unchecked") | 
  |  152 |     | 
           public List<KimRoleInfo> lookupRoles(Map<String, String> searchCriteria) { | 
  |  153 |    0 |                    Collection<RoleImpl> results = getBusinessObjectService().findMatching(RoleImpl.class, searchCriteria);  | 
  |  154 |    0 |                    ArrayList<KimRoleInfo> infoResults = new ArrayList<KimRoleInfo>( results.size() );  | 
  |  155 |    0 |                    for ( RoleImpl role : results ) { | 
  |  156 |    0 |                            infoResults.add( role.toSimpleInfo() );  | 
  |  157 |     | 
                   }  | 
  |  158 |    0 |                    return infoResults;  | 
  |  159 |     | 
           }  | 
  |  160 |     | 
     | 
  |  161 |     | 
           public boolean isRoleActive( String roleId ) { | 
  |  162 |    0 |                    RoleImpl role = getRoleImpl( roleId );  | 
  |  163 |    0 |                    return role != null && role.isActive();  | 
  |  164 |     | 
           }  | 
  |  165 |     | 
     | 
  |  166 |     | 
           public List<AttributeSet> getRoleQualifiersForPrincipalIncludingNested( String principalId, String namespaceCode, String roleName, AttributeSet qualification ) { | 
  |  167 |    0 |                    String roleId = getRoleIdByName(namespaceCode, roleName);  | 
  |  168 |    0 |                    if ( roleId == null ) { | 
  |  169 |    0 |                            return new ArrayList<AttributeSet>(0);  | 
  |  170 |     | 
                   }  | 
  |  171 |    0 |                    return getRoleQualifiersForPrincipalIncludingNested(principalId, Collections.singletonList(roleId), qualification);  | 
  |  172 |     | 
           }  | 
  |  173 |     | 
     | 
  |  174 |     | 
     | 
  |  175 |     | 
           private AttributeSet populateQualifiersForExactMatch(AttributeSet defaultQualification, List<String> attributes) { | 
  |  176 |    0 |                    AttributeSet qualifiersForExactMatch = new AttributeSet();  | 
  |  177 |    0 |                    if(defaultQualification != null && CollectionUtils.isNotEmpty(defaultQualification.keySet())) { | 
  |  178 |    0 |                            for(String attributeName : attributes) { | 
  |  179 |    0 |                                    if(StringUtils.isNotEmpty(defaultQualification.get(attributeName))) { | 
  |  180 |    0 |                                            qualifiersForExactMatch.put(attributeName, defaultQualification.get(attributeName));  | 
  |  181 |     | 
                                   }  | 
  |  182 |     | 
                           }  | 
  |  183 |     | 
                   }  | 
  |  184 |    0 |                    return qualifiersForExactMatch;  | 
  |  185 |     | 
           }  | 
  |  186 |     | 
             | 
  |  187 |     | 
           private List<RoleMemberImpl> getStoredRoleMembersUsingExactMatchOnQualification(String principalId, List<String> groupIds, List<String> roleIds, AttributeSet qualification) { | 
  |  188 |    0 |                List<String> copyRoleIds = new ArrayList<String>(roleIds);  | 
  |  189 |    0 |                List<RoleMemberImpl> rms = new ArrayList<RoleMemberImpl>();  | 
  |  190 |     | 
                 | 
  |  191 |    0 |                for(String roleId : roleIds) { | 
  |  192 |    0 |                        KimRoleTypeService roleTypeService = getRoleTypeService( roleId );  | 
  |  193 |    0 |                        if(roleTypeService != null) { | 
  |  194 |    0 |                                List<String> attributesForExactMatch = roleTypeService.getQualifiersForExactMatch();  | 
  |  195 |    0 |                                if(CollectionUtils.isNotEmpty(attributesForExactMatch)) { | 
  |  196 |    0 |                                        copyRoleIds.remove(roleId);  | 
  |  197 |    0 |                                        rms.addAll(getStoredRoleMembersForRoleIdsWithFilters(Collections.singletonList(roleId), principalId, groupIds, populateQualifiersForExactMatch(qualification, attributesForExactMatch)));  | 
  |  198 |     | 
                               }  | 
  |  199 |     | 
                       }  | 
  |  200 |    0 |                }  | 
  |  201 |    0 |                if(CollectionUtils.isNotEmpty(copyRoleIds)) { | 
  |  202 |    0 |                        rms.addAll(getStoredRoleMembersForRoleIdsWithFilters(copyRoleIds, principalId, groupIds, null));  | 
  |  203 |     | 
               }  | 
  |  204 |    0 |                return rms;  | 
  |  205 |     | 
           }  | 
  |  206 |     | 
             | 
  |  207 |     | 
           public List<AttributeSet> getRoleQualifiersForPrincipalIncludingNested( String principalId, List<String> roleIds, AttributeSet qualification ) { | 
  |  208 |    0 |                    List<AttributeSet> results = new ArrayList<AttributeSet>();  | 
  |  209 |     | 
     | 
  |  210 |    0 |                Map<String,RoleImpl> roles = getRoleImplMap(roleIds);  | 
  |  211 |     | 
     | 
  |  212 |     | 
                 | 
  |  213 |    0 |                List<String> groupIds = getIdentityManagementService().getGroupIdsForPrincipal(principalId);  | 
  |  214 |    0 |                List<RoleMemberImpl> rms = getStoredRoleMembersUsingExactMatchOnQualification(principalId, groupIds, roleIds, qualification);  | 
  |  215 |     | 
     | 
  |  216 |    0 |                Map<String,List<RoleMembershipInfo>> roleIdToMembershipMap = new HashMap<String,List<RoleMembershipInfo>>();  | 
  |  217 |    0 |                for ( RoleMemberImpl rm : rms ) { | 
  |  218 |    0 |                        KimRoleTypeService roleTypeService = getRoleTypeService( rm.getRoleId() );  | 
  |  219 |     | 
                         | 
  |  220 |    0 |                        if ( rm.getMemberTypeCode().equals( Role.PRINCIPAL_MEMBER_TYPE )  | 
  |  221 |     | 
                                           || rm.getMemberTypeCode().equals( Role.GROUP_MEMBER_TYPE ) ) { | 
  |  222 |    0 |                                if ( roleTypeService != null ) { | 
  |  223 |    0 |                                        List<RoleMembershipInfo> las = roleIdToMembershipMap.get( rm.getRoleId() );  | 
  |  224 |    0 |                                        if ( las == null ) { | 
  |  225 |    0 |                                                las = new ArrayList<RoleMembershipInfo>();  | 
  |  226 |    0 |                                                roleIdToMembershipMap.put( rm.getRoleId(), las );  | 
  |  227 |     | 
                                       }  | 
  |  228 |    0 |                                    RoleMembershipInfo mi = new RoleMembershipInfo( rm.getRoleId(), rm.getRoleMemberId(), rm.getMemberId(), rm.getMemberTypeCode(), rm.getQualifier() );  | 
  |  229 |    0 |                                        las.add( mi );  | 
  |  230 |    0 |                                } else { | 
  |  231 |    0 |                                        results.add(rm.getQualifier());  | 
  |  232 |     | 
                               }  | 
  |  233 |    0 |                        } else if ( rm.getMemberTypeCode().equals( Role.ROLE_MEMBER_TYPE )  ) { | 
  |  234 |     | 
                                 | 
  |  235 |     | 
                                 | 
  |  236 |    0 |                                AttributeSet nestedQualification = qualification;  | 
  |  237 |    0 |                                if ( roleTypeService != null ) { | 
  |  238 |    0 |                                        RoleImpl role = roles.get(rm.getRoleId());  | 
  |  239 |     | 
                                         | 
  |  240 |     | 
                                         | 
  |  241 |    0 |                                        RoleImpl nestedRole = getRoleImpl(rm.getMemberId());  | 
  |  242 |     | 
                                         | 
  |  243 |     | 
                         | 
  |  244 |     | 
                                       try { | 
  |  245 |    0 |                                            nestedQualification = roleTypeService.convertQualificationForMemberRoles(role.getNamespaceCode(), role.getRoleName(), nestedRole.getNamespaceCode(), nestedRole.getRoleName(), qualification);  | 
  |  246 |    0 |                                        } catch (Exception ex) { | 
  |  247 |    0 |                            LOG.warn("Not able to retrieve RoleTypeService from remote system for role Id: " + role.getRoleId(), ex); | 
  |  248 |    0 |                        }  | 
  |  249 |     | 
                               }  | 
  |  250 |    0 |                                List<String> nestedRoleId = new ArrayList<String>(1);  | 
  |  251 |    0 |                                nestedRoleId.add( rm.getMemberId() );  | 
  |  252 |     | 
                                 | 
  |  253 |     | 
                                 | 
  |  254 |    0 |                                if ( principalHasRole( principalId, nestedRoleId, nestedQualification, false ) ) { | 
  |  255 |    0 |                                        results.add( rm.getQualifier() );  | 
  |  256 |     | 
                               }  | 
  |  257 |     | 
                       }  | 
  |  258 |    0 |                }  | 
  |  259 |    0 |                    for ( String roleId : roleIdToMembershipMap.keySet() ) { | 
  |  260 |    0 |                            KimRoleTypeService roleTypeService = getRoleTypeService( roleId );  | 
  |  261 |     | 
                             | 
  |  262 |     | 
                 | 
  |  263 |     | 
               try { | 
  |  264 |    0 |                                List<RoleMembershipInfo> matchingMembers = roleTypeService.doRoleQualifiersMatchQualification( qualification, roleIdToMembershipMap.get( roleId ) );  | 
  |  265 |    0 |                                for ( RoleMembershipInfo rmi : matchingMembers ) { | 
  |  266 |    0 |                                        results.add( rmi.getQualifier() );  | 
  |  267 |     | 
                               }  | 
  |  268 |    0 |                } catch (Exception ex) { | 
  |  269 |    0 |                    LOG.warn("Not able to retrieve RoleTypeService from remote system for role Id: " + roleId, ex); | 
  |  270 |    0 |                }  | 
  |  271 |    0 |                    }  | 
  |  272 |    0 |                return results;  | 
  |  273 |     | 
           }  | 
  |  274 |     | 
     | 
  |  275 |     | 
           public List<AttributeSet> getRoleQualifiersForPrincipal( String principalId, List<String> roleIds, AttributeSet qualification ) { | 
  |  276 |    0 |                    List<AttributeSet> results = new ArrayList<AttributeSet>();  | 
  |  277 |     | 
     | 
  |  278 |     | 
                 | 
  |  279 |     | 
                 | 
  |  280 |    0 |                List<RoleMemberImpl> rms = getStoredRoleMembersUsingExactMatchOnQualification(principalId, null, roleIds, qualification);  | 
  |  281 |     | 
     | 
  |  282 |    0 |                Map<String,List<RoleMembershipInfo>> roleIdToMembershipMap = new HashMap<String,List<RoleMembershipInfo>>();  | 
  |  283 |    0 |                for ( RoleMemberImpl rm : rms ) { | 
  |  284 |     | 
                         | 
  |  285 |    0 |                        if ( rm.getMemberTypeCode().equals( Role.PRINCIPAL_MEMBER_TYPE )) { | 
  |  286 |    0 |                                KimRoleTypeService roleTypeService = getRoleTypeService( rm.getRoleId() );  | 
  |  287 |    0 |                                if ( roleTypeService != null ) { | 
  |  288 |    0 |                                        List<RoleMembershipInfo> las = roleIdToMembershipMap.get( rm.getRoleId() );  | 
  |  289 |    0 |                                        if ( las == null ) { | 
  |  290 |    0 |                                                las = new ArrayList<RoleMembershipInfo>();  | 
  |  291 |    0 |                                                roleIdToMembershipMap.put( rm.getRoleId(), las );  | 
  |  292 |     | 
                                       }  | 
  |  293 |    0 |                                    RoleMembershipInfo mi = new RoleMembershipInfo( rm.getRoleId(), rm.getRoleMemberId(), rm.getMemberId(), rm.getMemberTypeCode(), rm.getQualifier() );  | 
  |  294 |    0 |                                        las.add( mi );  | 
  |  295 |    0 |                                } else { | 
  |  296 |    0 |                                        results.add(rm.getQualifier());  | 
  |  297 |     | 
                               }  | 
  |  298 |    0 |                        }  | 
  |  299 |     | 
               }  | 
  |  300 |    0 |                    for ( String roleId : roleIdToMembershipMap.keySet() ) { | 
  |  301 |    0 |                            KimRoleTypeService roleTypeService = getRoleTypeService( roleId );  | 
  |  302 |     | 
                             | 
  |  303 |     | 
                 | 
  |  304 |     | 
               try { | 
  |  305 |    0 |                                List<RoleMembershipInfo> matchingMembers = roleTypeService.doRoleQualifiersMatchQualification( qualification, roleIdToMembershipMap.get( roleId ) );  | 
  |  306 |    0 |                                for ( RoleMembershipInfo rmi : matchingMembers ) { | 
  |  307 |    0 |                                        results.add( rmi.getQualifier() );  | 
  |  308 |     | 
                               }  | 
  |  309 |    0 |                } catch (Exception ex) { | 
  |  310 |    0 |                    LOG.warn("Not able to retrieve RoleTypeService from remote system for role Id: " + roleId, ex); | 
  |  311 |    0 |                }  | 
  |  312 |    0 |                    }  | 
  |  313 |    0 |                return results;  | 
  |  314 |     | 
           }  | 
  |  315 |     | 
     | 
  |  316 |     | 
           public List<AttributeSet> getRoleQualifiersForPrincipal( String principalId, String namespaceCode, String roleName, AttributeSet qualification ) { | 
  |  317 |    0 |                    return getRoleQualifiersForPrincipal(  | 
  |  318 |     | 
                                   principalId,  | 
  |  319 |     | 
                                   Collections.singletonList(getRoleIdByName(namespaceCode, roleName)),  | 
  |  320 |     | 
                                   qualification);  | 
  |  321 |     | 
           }  | 
  |  322 |     | 
     | 
  |  323 |     | 
     | 
  |  324 |     | 
         | 
  |  325 |     | 
         | 
  |  326 |     | 
         | 
  |  327 |     | 
     | 
  |  328 |     | 
         | 
  |  329 |     | 
     | 
  |  330 |     | 
     | 
  |  331 |     | 
       public List<RoleMembershipInfo> getRoleMembers(List<String> roleIds, AttributeSet qualification) { | 
  |  332 |    0 |                Set<String> foundRoleTypeMembers = new HashSet<String>();  | 
  |  333 |    0 |                return getRoleMembers(roleIds, qualification, true, foundRoleTypeMembers);  | 
  |  334 |     | 
       }  | 
  |  335 |     | 
     | 
  |  336 |     | 
         | 
  |  337 |     | 
     | 
  |  338 |     | 
           public Collection<String> getRoleMemberPrincipalIds(String namespaceCode, String roleName, AttributeSet qualification) { | 
  |  339 |    0 |                    Set<String> principalIds = new HashSet<String>();  | 
  |  340 |    0 |                Set<String> foundRoleTypeMembers = new HashSet<String>();  | 
  |  341 |    0 |                    List<String> roleIds = Collections.singletonList(getRoleIdByName(namespaceCode, roleName));  | 
  |  342 |    0 |                for (RoleMembershipInfo roleMembershipInfo : getRoleMembers(roleIds, qualification, false, foundRoleTypeMembers)) { | 
  |  343 |    0 |                        if (Role.GROUP_MEMBER_TYPE.equals(roleMembershipInfo.getMemberTypeCode())) { | 
  |  344 |    0 |                                principalIds.addAll(getIdentityManagementService().getGroupMemberPrincipalIds(roleMembershipInfo.getMemberId()));  | 
  |  345 |     | 
                       }  | 
  |  346 |     | 
                       else { | 
  |  347 |    0 |                                principalIds.add(roleMembershipInfo.getMemberId());  | 
  |  348 |     | 
                       }  | 
  |  349 |     | 
                   }  | 
  |  350 |    0 |                return principalIds;  | 
  |  351 |     | 
           }  | 
  |  352 |     | 
     | 
  |  353 |     | 
           protected Collection<RoleMembershipInfo> getNestedRoleMembers( AttributeSet qualification, RoleMembershipInfo rm, Set<String> foundRoleTypeMembers ) { | 
  |  354 |     | 
                     | 
  |  355 |    0 |                    if (foundRoleTypeMembers.contains(rm.getMemberId())){ | 
  |  356 |    0 |                            return new ArrayList<RoleMembershipInfo>();    | 
  |  357 |     | 
                   }  | 
  |  358 |    0 |                    foundRoleTypeMembers.add(rm.getMemberId());  | 
  |  359 |     | 
     | 
  |  360 |    0 |                    ArrayList<String> roleIdList = new ArrayList<String>( 1 );  | 
  |  361 |    0 |                    roleIdList.add( rm.getMemberId() );  | 
  |  362 |     | 
     | 
  |  363 |     | 
                     | 
  |  364 |    0 |                    Collection<RoleMembershipInfo> nestedRoleMembers = getRoleMembers( roleIdList, qualification, false, foundRoleTypeMembers );  | 
  |  365 |     | 
                     | 
  |  366 |    0 |                    for ( RoleMembershipInfo rmi : nestedRoleMembers ) { | 
  |  367 |     | 
                             | 
  |  368 |    0 |                            rmi.setRoleMemberId( rm.getRoleMemberId() );  | 
  |  369 |     | 
                             | 
  |  370 |    0 |                            rmi.setRoleId( rm.getRoleId() );  | 
  |  371 |    0 |                            rmi.setEmbeddedRoleId( rm.getMemberId() );  | 
  |  372 |     | 
                   }  | 
  |  373 |    0 |                    return nestedRoleMembers;  | 
  |  374 |     | 
           }  | 
  |  375 |     | 
     | 
  |  376 |     | 
             | 
  |  377 |     | 
     | 
  |  378 |     | 
     | 
  |  379 |     | 
       protected List<RoleMembershipInfo> getRoleMembers(List<String> roleIds, AttributeSet qualification, boolean followDelegations, Set<String> foundRoleTypeMembers ) { | 
  |  380 |    0 |                List<RoleMembershipInfo> results = new ArrayList<RoleMembershipInfo>();  | 
  |  381 |    0 |                Set<String> allRoleIds = new HashSet<String>();  | 
  |  382 |    0 |                for ( String roleId : roleIds ) { | 
  |  383 |    0 |                        if ( isRoleActive(roleId) ) { | 
  |  384 |    0 |                                allRoleIds.add(roleId);  | 
  |  385 |     | 
                       }  | 
  |  386 |     | 
               }  | 
  |  387 |     | 
                 | 
  |  388 |    0 |                if ( allRoleIds.isEmpty() ) { | 
  |  389 |    0 |                        return results;  | 
  |  390 |     | 
               }  | 
  |  391 |    0 |                Set<String> matchingRoleIds = new HashSet<String>( allRoleIds.size() );  | 
  |  392 |     | 
                 | 
  |  393 |    0 |                Map<String,RoleImpl> roles = getRoleImplMap(allRoleIds);  | 
  |  394 |     | 
     | 
  |  395 |    0 |                List<String> copyRoleIds = new ArrayList<String>(allRoleIds);  | 
  |  396 |    0 |                List<RoleMemberImpl> rms = new ArrayList<RoleMemberImpl>();  | 
  |  397 |     | 
                 | 
  |  398 |    0 |                for(String roleId : allRoleIds) { | 
  |  399 |    0 |                        KimRoleTypeService roleTypeService = getRoleTypeService( roleId );  | 
  |  400 |    0 |                        if(roleTypeService != null) { | 
  |  401 |    0 |                                List<String> attributesForExactMatch = roleTypeService.getQualifiersForExactMatch();  | 
  |  402 |    0 |                                if(CollectionUtils.isNotEmpty(attributesForExactMatch)) { | 
  |  403 |    0 |                                        copyRoleIds.remove(roleId);  | 
  |  404 |    0 |                                        rms.addAll(getStoredRoleMembersForRoleIds(Collections.singletonList(roleId), null, populateQualifiersForExactMatch(qualification, attributesForExactMatch)));  | 
  |  405 |     | 
                               }    | 
  |  406 |     | 
                       }  | 
  |  407 |    0 |                }  | 
  |  408 |    0 |                if(CollectionUtils.isNotEmpty(copyRoleIds)) { | 
  |  409 |    0 |                        rms.addAll(getStoredRoleMembersForRoleIds(copyRoleIds, null, null));  | 
  |  410 |     | 
               }  | 
  |  411 |     | 
                 | 
  |  412 |     | 
                 | 
  |  413 |     | 
                 | 
  |  414 |    0 |                Map<String,List<RoleMembershipInfo>> roleIdToMembershipMap = new HashMap<String,List<RoleMembershipInfo>>();  | 
  |  415 |    0 |                for ( RoleMemberImpl rm : rms ) { | 
  |  416 |    0 |                            RoleMembershipInfo mi = new RoleMembershipInfo( rm.getRoleId(), rm.getRoleMemberId(), rm.getMemberId(), rm.getMemberTypeCode(), rm.getQualifier() );  | 
  |  417 |     | 
                             | 
  |  418 |    0 |                            if ( (qualification == null || qualification.isEmpty()) || getRoleTypeService( rm.getRoleId() ) == null ) { | 
  |  419 |    0 |                                    if ( rm.getMemberTypeCode().equals( Role.ROLE_MEMBER_TYPE ) ) { | 
  |  420 |     | 
                                             | 
  |  421 |     | 
                                             | 
  |  422 |     | 
                                             | 
  |  423 |    0 |                                            AttributeSet nestedRoleQualification = qualification;  | 
  |  424 |    0 |                                            if ( getRoleTypeService( rm.getRoleId() ) != null ) { | 
  |  425 |     | 
                                 | 
  |  426 |    0 |                                                RoleImpl memberRole = getRoleImpl( mi.getMemberId() );  | 
  |  427 |    0 |                                                    nestedRoleQualification = getRoleTypeService( rm.getRoleId() )  | 
  |  428 |     | 
                                                            .convertQualificationForMemberRoles(  | 
  |  429 |     | 
                                                                    roles.get(rm.getRoleId()).getNamespaceCode(),  | 
  |  430 |     | 
                                                                    roles.get(rm.getRoleId()).getRoleName(),  | 
  |  431 |     | 
                                                                    memberRole.getNamespaceCode(),  | 
  |  432 |     | 
                                                                    memberRole.getRoleName(),  | 
  |  433 |     | 
                                                                    qualification );  | 
  |  434 |     | 
                                           }  | 
  |  435 |    0 |                                            if ( isRoleActive( rm.getRoleId() ) ) { | 
  |  436 |    0 |                                                    Collection<RoleMembershipInfo> nestedRoleMembers = getNestedRoleMembers( nestedRoleQualification, mi, foundRoleTypeMembers );  | 
  |  437 |    0 |                                                    if ( !nestedRoleMembers.isEmpty() ) { | 
  |  438 |    0 |                                                            results.addAll( nestedRoleMembers );  | 
  |  439 |    0 |                                                            matchingRoleIds.add( rm.getRoleId() );  | 
  |  440 |     | 
                                                   }  | 
  |  441 |     | 
                                           }  | 
  |  442 |    0 |                                    } else {  | 
  |  443 |    0 |                                            results.add( mi );  | 
  |  444 |    0 |                                            matchingRoleIds.add( rm.getRoleId() );  | 
  |  445 |     | 
                                   }  | 
  |  446 |    0 |                                    matchingRoleIds.add( rm.getRoleId() );  | 
  |  447 |     | 
                           } else { | 
  |  448 |    0 |                                    List<RoleMembershipInfo> lrmi = roleIdToMembershipMap.get( mi.getRoleId() );  | 
  |  449 |    0 |                                    if ( lrmi == null ) { | 
  |  450 |    0 |                                            lrmi = new ArrayList<RoleMembershipInfo>();  | 
  |  451 |    0 |                                            roleIdToMembershipMap.put( mi.getRoleId(), lrmi );  | 
  |  452 |     | 
                                   }  | 
  |  453 |    0 |                                    lrmi.add( mi );  | 
  |  454 |     | 
                           }  | 
  |  455 |    0 |                }  | 
  |  456 |     | 
                 | 
  |  457 |     | 
                 | 
  |  458 |    0 |                if ( !roleIdToMembershipMap.isEmpty() ) { | 
  |  459 |     | 
                         | 
  |  460 |     | 
                         | 
  |  461 |    0 |                        for ( String roleId : roleIdToMembershipMap.keySet() ) { | 
  |  462 |     | 
                             | 
  |  463 |     | 
                     | 
  |  464 |     | 
                   try { | 
  |  465 |    0 |                                    KimRoleTypeService roleTypeService = getRoleTypeService( roleId );  | 
  |  466 |    0 |                                    List<RoleMembershipInfo> matchingMembers = roleTypeService.doRoleQualifiersMatchQualification( qualification, roleIdToMembershipMap.get( roleId ) );  | 
  |  467 |     | 
                                     | 
  |  468 |    0 |                                    for ( RoleMembershipInfo mi : matchingMembers ) { | 
  |  469 |    0 |                                            if ( mi.getMemberTypeCode().equals( Role.ROLE_MEMBER_TYPE ) ) { | 
  |  470 |     | 
                                                     | 
  |  471 |     | 
                                                     | 
  |  472 |     | 
                                                     | 
  |  473 |     | 
                                 | 
  |  474 |    0 |                                RoleImpl memberRole = getRoleImpl( mi.getMemberId() );  | 
  |  475 |    0 |                                if ( memberRole.isActive() ) { | 
  |  476 |    0 |                                                            AttributeSet nestedRoleQualification = roleTypeService.convertQualificationForMemberRoles(  | 
  |  477 |     | 
                                                                   roles.get(mi.getRoleId()).getNamespaceCode(),  | 
  |  478 |     | 
                                                                   roles.get(mi.getRoleId()).getRoleName(),  | 
  |  479 |     | 
                                               memberRole.getNamespaceCode(),  | 
  |  480 |     | 
                                               memberRole.getRoleName(),  | 
  |  481 |     | 
                                                                   qualification );  | 
  |  482 |    0 |                                                            Collection<RoleMembershipInfo> nestedRoleMembers = getNestedRoleMembers( nestedRoleQualification, mi, foundRoleTypeMembers );  | 
  |  483 |    0 |                                                            if ( !nestedRoleMembers.isEmpty() ) { | 
  |  484 |    0 |                                                                    results.addAll( nestedRoleMembers );  | 
  |  485 |    0 |                                                                    matchingRoleIds.add( mi.getRoleId() );  | 
  |  486 |     | 
                                                           }  | 
  |  487 |     | 
                               }  | 
  |  488 |    0 |                                            } else {  | 
  |  489 |    0 |                                                    results.add( mi );  | 
  |  490 |    0 |                                                    matchingRoleIds.add( mi.getRoleId() );  | 
  |  491 |     | 
                                           }  | 
  |  492 |     | 
                                   }  | 
  |  493 |    0 |                            } catch (Exception ex) { | 
  |  494 |    0 |                        LOG.warn("Not able to retrieve RoleTypeService from remote system for role Id: " + roleId, ex); | 
  |  495 |    0 |                    }  | 
  |  496 |     | 
                       }  | 
  |  497 |     | 
               }  | 
  |  498 |     | 
     | 
  |  499 |     | 
                 | 
  |  500 |    0 |                for ( String roleId : allRoleIds ) { | 
  |  501 |    0 |                        KimRoleTypeService roleTypeService = getRoleTypeService( roleId );  | 
  |  502 |    0 |                            RoleImpl role = roles.get( roleId );  | 
  |  503 |     | 
                         | 
  |  504 |     | 
               try { | 
  |  505 |    0 |                            if ( isApplicationRoleType(role.getKimTypeId(), roleTypeService) ) { | 
  |  506 |     | 
                         | 
  |  507 |    0 |                                    List<RoleMembershipInfo> roleMembers = roleTypeService.getRoleMembersFromApplicationRole(role.getNamespaceCode(), role.getRoleName(), qualification);  | 
  |  508 |    0 |                                    if ( !roleMembers.isEmpty()  ) { | 
  |  509 |    0 |                                            matchingRoleIds.add( roleId );  | 
  |  510 |     | 
                                   }  | 
  |  511 |    0 |                                    for ( RoleMembershipInfo rm : roleMembers ) { | 
  |  512 |    0 |                                        rm.setRoleId(roleId);  | 
  |  513 |    0 |                                        rm.setRoleMemberId("*"); | 
  |  514 |     | 
                                   }  | 
  |  515 |    0 |                                    results.addAll(roleMembers);  | 
  |  516 |     | 
                           }  | 
  |  517 |    0 |                } catch (Exception ex) { | 
  |  518 |    0 |                    LOG.warn("Not able to retrieve RoleTypeService from remote system for role Id: " + roleId, ex); | 
  |  519 |    0 |                }  | 
  |  520 |    0 |                }  | 
  |  521 |     | 
     | 
  |  522 |    0 |                if ( followDelegations && !matchingRoleIds.isEmpty() ) { | 
  |  523 |     | 
                         | 
  |  524 |     | 
                         | 
  |  525 |    0 |                        Map<String,KimDelegationImpl> delegations = getStoredDelegationImplMapFromRoleIds(matchingRoleIds);  | 
  |  526 |     | 
     | 
  |  527 |    0 |                        matchDelegationsToRoleMembers( results, delegations.values() );  | 
  |  528 |    0 |                        resolveDelegationMembers( results, qualification, foundRoleTypeMembers );  | 
  |  529 |     | 
               }  | 
  |  530 |     | 
     | 
  |  531 |     | 
                 | 
  |  532 |     | 
                 | 
  |  533 |    0 |                if ( results.size() > 1 ) { | 
  |  534 |     | 
                     | 
  |  535 |    0 |                    if ( matchingRoleIds.size() == 1 ) { | 
  |  536 |    0 |                        String roleId = matchingRoleIds.iterator().next();  | 
  |  537 |    0 |                            KimRoleTypeService kimRoleTypeService = getRoleTypeService( roleId );  | 
  |  538 |     | 
                             | 
  |  539 |     | 
                     | 
  |  540 |     | 
                   try { | 
  |  541 |    0 |                                if ( kimRoleTypeService != null ) { | 
  |  542 |    0 |                                        results = kimRoleTypeService.sortRoleMembers( results );  | 
  |  543 |     | 
                               }  | 
  |  544 |    0 |                    } catch (Exception ex) { | 
  |  545 |    0 |                        LOG.warn("Not able to retrieve RoleTypeService from remote system for role Id: " + roleId, ex); | 
  |  546 |    0 |                    }  | 
  |  547 |    0 |                    } else if ( matchingRoleIds.size() > 1 ) { | 
  |  548 |     | 
                             | 
  |  549 |    0 |                        String prevServiceName = null;  | 
  |  550 |    0 |                        boolean multipleServices = false;  | 
  |  551 |    0 |                            for ( String roleId : matchingRoleIds ) { | 
  |  552 |    0 |                                    String serviceName = getRoleImpl( roleId ).getKimRoleType().getKimTypeServiceName();  | 
  |  553 |    0 |                                    if ( prevServiceName != null && !StringUtils.equals( prevServiceName, serviceName ) ) { | 
  |  554 |    0 |                                            multipleServices = true;  | 
  |  555 |    0 |                                            break;  | 
  |  556 |     | 
                                   }  | 
  |  557 |    0 |                                        prevServiceName = serviceName;  | 
  |  558 |    0 |                            }  | 
  |  559 |    0 |                            if ( !multipleServices ) { | 
  |  560 |    0 |                                String roleId = matchingRoleIds.iterator().next();  | 
  |  561 |     | 
                                 | 
  |  562 |     | 
                         | 
  |  563 |     | 
                       try {                        | 
  |  564 |    0 |                                    KimRoleTypeService kimRoleTypeService = getRoleTypeService( roleId );  | 
  |  565 |    0 |                                    if ( kimRoleTypeService != null ) { | 
  |  566 |    0 |                                            results = kimRoleTypeService.sortRoleMembers( results );  | 
  |  567 |     | 
                                   }  | 
  |  568 |    0 |                                } catch (Exception ex) { | 
  |  569 |    0 |                            LOG.warn("Not able to retrieve RoleTypeService from remote system for role Id: " + roleId, ex); | 
  |  570 |    0 |                        }  | 
  |  571 |    0 |                            } else { | 
  |  572 |    0 |                                    LOG.warn( "Did not sort role members - multiple role type services found.  Role Ids: " + matchingRoleIds );  | 
  |  573 |     | 
                           }  | 
  |  574 |     | 
                   }  | 
  |  575 |     | 
               }  | 
  |  576 |     | 
     | 
  |  577 |    0 |                return results;  | 
  |  578 |     | 
       }  | 
  |  579 |     | 
     | 
  |  580 |     | 
       protected boolean isApplicationRoleType( String roleTypeId, KimRoleTypeService service ) { | 
  |  581 |    0 |                Boolean result = getApplicationRoleTypeCache().get( roleTypeId );  | 
  |  582 |    0 |                if ( result == null ) { | 
  |  583 |    0 |                        if ( service != null ) { | 
  |  584 |    0 |                                result = service.isApplicationRoleType();  | 
  |  585 |     | 
                       } else { | 
  |  586 |    0 |                                result = Boolean.FALSE;  | 
  |  587 |     | 
                       }  | 
  |  588 |     | 
               }  | 
  |  589 |    0 |                return result;  | 
  |  590 |     | 
       }  | 
  |  591 |     | 
     | 
  |  592 |     | 
         | 
  |  593 |     | 
     | 
  |  594 |     | 
     | 
  |  595 |     | 
     | 
  |  596 |     | 
     | 
  |  597 |     | 
     | 
  |  598 |     | 
       protected KimRoleTypeService getRoleTypeService( String roleId ) { | 
  |  599 |    0 |            KimRoleTypeService service = getRoleTypeServiceCache().get( roleId );  | 
  |  600 |    0 |                if ( service == null && !getRoleTypeServiceCache().containsKey( roleId ) ) { | 
  |  601 |    0 |                        RoleImpl role = getRoleImpl( roleId );  | 
  |  602 |    0 |                        KimTypeInfo roleType = role.getKimRoleType();  | 
  |  603 |    0 |                        if ( roleType != null ) { | 
  |  604 |    0 |                            service = getRoleTypeService(roleType);  | 
  |  605 |     | 
                       }  | 
  |  606 |    0 |                        getRoleTypeServiceCache().put(roleId, service);  | 
  |  607 |     | 
               }  | 
  |  608 |    0 |                return service;  | 
  |  609 |     | 
       }  | 
  |  610 |     | 
         | 
  |  611 |     | 
       protected KimRoleTypeService getRoleTypeService( KimTypeInfo typeInfo ) { | 
  |  612 |    0 |                    String serviceName = typeInfo.getKimTypeServiceName();  | 
  |  613 |    0 |                    if ( serviceName != null ) { | 
  |  614 |     | 
                           try { | 
  |  615 |    0 |                                    KimTypeService service = (KimTypeService) KIMServiceLocatorInternal.getService(serviceName);  | 
  |  616 |    0 |                                    if ( service != null && service instanceof KimRoleTypeService) { | 
  |  617 |    0 |                                            return (KimRoleTypeService)service;  | 
  |  618 |     | 
                                   }   | 
  |  619 |    0 |                                    return (KimRoleTypeService) KIMServiceLocatorInternal.getService("kimNoMembersRoleTypeService"); | 
  |  620 |    0 |                            } catch ( Exception ex ) { | 
  |  621 |    0 |                                    LOG.error( "Unable to find role type service with name: " + serviceName );  | 
  |  622 |    0 |                                    LOG.error( ex.getClass().getName() + " : " + ex.getMessage() );  | 
  |  623 |    0 |                                    return (KimRoleTypeService) KIMServiceLocatorInternal.getService("kimNoMembersRoleTypeService"); | 
  |  624 |     | 
                           }  | 
  |  625 |     | 
                   }  | 
  |  626 |    0 |                    return null;  | 
  |  627 |     | 
       }  | 
  |  628 |     | 
     | 
  |  629 |     | 
       protected KimDelegationTypeService getDelegationTypeService( String delegationId ) { | 
  |  630 |    0 |                KimDelegationTypeService service = getDelegationTypeServiceCache().get( delegationId );  | 
  |  631 |    0 |                if ( service == null && !getDelegationTypeServiceCache().containsKey( delegationId ) ) { | 
  |  632 |    0 |                        KimDelegationImpl delegation = getKimDelegationImpl(delegationId);  | 
  |  633 |    0 |                        KimTypeInfo delegationType = delegation.getKimType();  | 
  |  634 |    0 |                        if ( delegationType != null ) { | 
  |  635 |    0 |                                KimTypeService tempService = KIMServiceLocatorWeb.getKimTypeService(delegationType);  | 
  |  636 |    0 |                                if ( tempService != null && tempService instanceof KimDelegationTypeService ) { | 
  |  637 |    0 |                                        service = (KimDelegationTypeService)tempService;  | 
  |  638 |     | 
                               } else { | 
  |  639 |    0 |                                        LOG.error( "Service returned for type " + delegationType + "("+delegationType.getKimTypeServiceName()+") was not a KimDelegationTypeService.  Was a " + tempService.getClass() ); | 
  |  640 |     | 
                               }  | 
  |  641 |    0 |                        } else {  | 
  |  642 |    0 |                                KimRoleTypeService roleTypeService = getRoleTypeService( delegation.getRoleId() );  | 
  |  643 |    0 |                                if ( roleTypeService != null && roleTypeService instanceof KimDelegationTypeService ) { | 
  |  644 |    0 |                                        service = (KimDelegationTypeService)roleTypeService;  | 
  |  645 |     | 
                               }  | 
  |  646 |     | 
                       }  | 
  |  647 |    0 |                        getDelegationTypeServiceCache().put(delegationId, service);  | 
  |  648 |     | 
               }  | 
  |  649 |    0 |                return service;  | 
  |  650 |     | 
       }  | 
  |  651 |     | 
     | 
  |  652 |     | 
         | 
  |  653 |     | 
     | 
  |  654 |     | 
     | 
  |  655 |     | 
     | 
  |  656 |     | 
     | 
  |  657 |     | 
     | 
  |  658 |     | 
     | 
  |  659 |     | 
     | 
  |  660 |     | 
       protected void matchDelegationsToRoleMembers( List<RoleMembershipInfo> results,  | 
  |  661 |     | 
                       Collection<KimDelegationImpl> delegations ) { | 
  |  662 |     | 
                 | 
  |  663 |     | 
                 | 
  |  664 |     | 
                 | 
  |  665 |    0 |                for ( RoleMembershipInfo mi : results ) { | 
  |  666 |     | 
                         | 
  |  667 |    0 |                        for ( KimDelegationImpl delegation : delegations ) { | 
  |  668 |     | 
                                 | 
  |  669 |    0 |                                if ( StringUtils.equals( delegation.getRoleId(), mi.getRoleId() ) ) { | 
  |  670 |    0 |                                    KimRoleTypeService roleTypeService = getRoleTypeService( delegation.getRoleId() );  | 
  |  671 |    0 |                                    for ( KimDelegationMemberImpl delegationMember : delegation.getMembers() ) { | 
  |  672 |     | 
                                             | 
  |  673 |     | 
                                             | 
  |  674 |    0 |                                            if (delegationMember.isActive()) { | 
  |  675 |     | 
                                                     | 
  |  676 |     | 
                                                     | 
  |  677 |     | 
                                                     | 
  |  678 |     | 
                                                     | 
  |  679 |    0 |                                                    if ( StringUtils.isBlank( delegationMember.getRoleMemberId() )  | 
  |  680 |     | 
                                                                   || StringUtils.equals( delegationMember.getRoleMemberId(), mi.getRoleMemberId() ) ) { | 
  |  681 |     | 
                                                         | 
  |  682 |     | 
                                                         | 
  |  683 |     | 
                                                         | 
  |  684 |     | 
                                                             | 
  |  685 |     | 
                                                             | 
  |  686 |    0 |                                                            if ( (StringUtils.isNotBlank( delegationMember.getRoleMemberId() )   | 
  |  687 |     | 
                                                                                   && StringUtils.equals( delegationMember.getRoleMemberId(), mi.getRoleMemberId() )  | 
  |  688 |     | 
                                                                                   )  | 
  |  689 |     | 
                                                                           || roleTypeService == null  | 
  |  690 |     | 
                                                                           || roleTypeService.doesRoleQualifierMatchQualification( mi.getQualifier(), delegationMember.getQualifier() ) ) { | 
  |  691 |     | 
                                                                     | 
  |  692 |     | 
                                                                     | 
  |  693 |     | 
                                                                     | 
  |  694 |    0 |                                                                    mi.getDelegates().add(  | 
  |  695 |     | 
                                                                                   new DelegateInfo(  | 
  |  696 |     | 
                                                                                                   delegation.getDelegationId(),  | 
  |  697 |     | 
                                                                                                   delegation.getDelegationTypeCode(),  | 
  |  698 |     | 
                                                                                                   delegationMember.getMemberId(),  | 
  |  699 |     | 
                                                                                                   delegationMember.getMemberTypeCode(),  | 
  |  700 |     | 
                                                                                                   delegationMember.getRoleMemberId(),  | 
  |  701 |     | 
                                                                                                   delegationMember.getQualifier() ) );  | 
  |  702 |     | 
                                                               }  | 
  |  703 |     | 
                                                   }  | 
  |  704 |     | 
                                           }  | 
  |  705 |     | 
                                   }  | 
  |  706 |    0 |                                }  | 
  |  707 |     | 
                       }  | 
  |  708 |     | 
               }  | 
  |  709 |     | 
     | 
  |  710 |    0 |        }  | 
  |  711 |     | 
     | 
  |  712 |     | 
         | 
  |  713 |     | 
     | 
  |  714 |     | 
     | 
  |  715 |     | 
     | 
  |  716 |     | 
     | 
  |  717 |     | 
       protected void resolveDelegationMembers( List<RoleMembershipInfo> results,  | 
  |  718 |     | 
                       AttributeSet qualification, Set<String> foundRoleTypeMembers ) { | 
  |  719 |     | 
     | 
  |  720 |     | 
                     | 
  |  721 |    0 |                    for ( RoleMembershipInfo mi : results ) { | 
  |  722 |     | 
                             | 
  |  723 |     | 
                             | 
  |  724 |    0 |                            ListIterator<DelegateInfo> i = mi.getDelegates().listIterator();  | 
  |  725 |    0 |                            while ( i.hasNext() ) { | 
  |  726 |    0 |                                    DelegateInfo di = i.next();  | 
  |  727 |    0 |                                    KimDelegationTypeService delegationTypeService = getDelegationTypeService( di.getDelegationId() );  | 
  |  728 |     | 
                                     | 
  |  729 |     | 
                                     | 
  |  730 |    0 |                                    if ( delegationTypeService == null || delegationTypeService.doesDelegationQualifierMatchQualification( qualification, di.getQualifier() )) { | 
  |  731 |     | 
                                             | 
  |  732 |    0 |                                            if ( di.getMemberTypeCode().equals( Role.ROLE_MEMBER_TYPE ) ) { | 
  |  733 |    0 |                                                i.remove();  | 
  |  734 |     | 
                                         | 
  |  735 |    0 |                                            ArrayList<String> roleIdTempList = new ArrayList<String>( 1 );  | 
  |  736 |    0 |                                            roleIdTempList.add( di.getMemberId() );  | 
  |  737 |     | 
     | 
  |  738 |     | 
                                             | 
  |  739 |    0 |                                        Collection<RoleMembershipInfo> delegateMembers = getRoleMembers(roleIdTempList, qualification, false, foundRoleTypeMembers);  | 
  |  740 |     | 
                                         | 
  |  741 |    0 |                                        for ( RoleMembershipInfo rmi : delegateMembers ) { | 
  |  742 |    0 |                                                i.add(  | 
  |  743 |     | 
                                                               new DelegateInfo(  | 
  |  744 |     | 
                                                                               di.getDelegationId(),  | 
  |  745 |     | 
                                                                               di.getDelegationTypeCode(),  | 
  |  746 |     | 
                                                                               rmi.getMemberId(),  | 
  |  747 |     | 
                                                                               rmi.getMemberTypeCode(),  | 
  |  748 |     | 
                                                                               di.getRoleMemberId(),  | 
  |  749 |     | 
                                                                               di.getQualifier() ) );  | 
  |  750 |     | 
                                       }   | 
  |  751 |    0 |                                            }   | 
  |  752 |     | 
                                   } else {  | 
  |  753 |    0 |                                            i.remove();  | 
  |  754 |     | 
                                   }  | 
  |  755 |    0 |                            }  | 
  |  756 |    0 |                    }  | 
  |  757 |    0 |        }  | 
  |  758 |     | 
     | 
  |  759 |     | 
         | 
  |  760 |     | 
     | 
  |  761 |     | 
     | 
  |  762 |     | 
       public boolean principalHasRole(String principalId, List<String> roleIds, AttributeSet qualification) { | 
  |  763 |    0 |                return principalHasRole( principalId, roleIds, qualification, true );  | 
  |  764 |     | 
       }  | 
  |  765 |     | 
     | 
  |  766 |     | 
         | 
  |  767 |     | 
     | 
  |  768 |     | 
     | 
  |  769 |     | 
       public List<String> getPrincipalIdSubListWithRole( List<String> principalIds, String roleNamespaceCode, String roleName, AttributeSet qualification ) { | 
  |  770 |    0 |                List<String> subList = new ArrayList<String>();  | 
  |  771 |    0 |                RoleImpl role = getRoleImplByName( roleNamespaceCode, roleName );  | 
  |  772 |    0 |                for ( String principalId : principalIds ) { | 
  |  773 |    0 |                        if ( principalHasRole( principalId, Collections.singletonList( role.getRoleId() ), qualification ) ) { | 
  |  774 |    0 |                                subList.add( principalId );  | 
  |  775 |     | 
                       }  | 
  |  776 |     | 
               }  | 
  |  777 |    0 |                return subList;  | 
  |  778 |     | 
       }  | 
  |  779 |     | 
     | 
  |  780 |     | 
     | 
  |  781 |     | 
     | 
  |  782 |     | 
     | 
  |  783 |     | 
     | 
  |  784 |     | 
     | 
  |  785 |     | 
     | 
  |  786 |     | 
     | 
  |  787 |     | 
     | 
  |  788 |     | 
     | 
  |  789 |     | 
     | 
  |  790 |     | 
     | 
  |  791 |     | 
     | 
  |  792 |     | 
     | 
  |  793 |     | 
     | 
  |  794 |     | 
     | 
  |  795 |     | 
     | 
  |  796 |     | 
     | 
  |  797 |     | 
     | 
  |  798 |     | 
     | 
  |  799 |     | 
     | 
  |  800 |     | 
     | 
  |  801 |     | 
         | 
  |  802 |     | 
     | 
  |  803 |     | 
     | 
  |  804 |     | 
     | 
  |  805 |     | 
     | 
  |  806 |     | 
       protected boolean getRoleIdToMembershipMap( Map<String,List<RoleMembershipInfo>> roleIdToMembershipMap, List<RoleMemberImpl> roleMembers ) { | 
  |  807 |    0 |                for ( RoleMemberImpl rm : roleMembers ) { | 
  |  808 |    0 |                            RoleMembershipInfo mi = new RoleMembershipInfo( rm.getRoleId(), rm.getRoleMemberId(), rm.getMemberId(), rm.getMemberTypeCode(), rm.getQualifier() );  | 
  |  809 |     | 
                         | 
  |  810 |    0 |                            if ( getRoleTypeService( rm.getRoleId() ) == null ) { | 
  |  811 |    0 |                                    return true;  | 
  |  812 |     | 
                           }   | 
  |  813 |    0 |                            List<RoleMembershipInfo> lrmi = roleIdToMembershipMap.get( mi.getRoleId() );  | 
  |  814 |    0 |                            if ( lrmi == null ) { | 
  |  815 |    0 |                                    lrmi = new ArrayList<RoleMembershipInfo>();  | 
  |  816 |    0 |                                    roleIdToMembershipMap.put( mi.getRoleId(), lrmi );  | 
  |  817 |     | 
                           }  | 
  |  818 |    0 |                            lrmi.add( mi );  | 
  |  819 |    0 |                }  | 
  |  820 |    0 |                return false;  | 
  |  821 |     | 
             }  | 
  |  822 |     | 
     | 
  |  823 |     | 
           private List<RoleMemberImpl> getStoredRoleGroupsUsingExactMatchOnQualification(List<String> groupIds, Set<String> roleIds, AttributeSet qualification) { | 
  |  824 |    0 |                List<String> copyRoleIds = new ArrayList<String>(roleIds);  | 
  |  825 |    0 |                List<RoleMemberImpl> rms = new ArrayList<RoleMemberImpl>();  | 
  |  826 |     | 
                 | 
  |  827 |    0 |                for(String roleId : roleIds) { | 
  |  828 |    0 |                        KimRoleTypeService roleTypeService = getRoleTypeService( roleId );  | 
  |  829 |    0 |                        if(roleTypeService != null) { | 
  |  830 |    0 |                                List<String> attributesForExactMatch = roleTypeService.getQualifiersForExactMatch();  | 
  |  831 |    0 |                                if(CollectionUtils.isNotEmpty(attributesForExactMatch)) { | 
  |  832 |    0 |                                        copyRoleIds.remove(roleId);  | 
  |  833 |    0 |                                        rms.addAll(getStoredRoleGroupsForGroupIdsAndRoleIds(Collections.singletonList(roleId), groupIds, populateQualifiersForExactMatch(qualification, attributesForExactMatch)));  | 
  |  834 |     | 
                               }  | 
  |  835 |     | 
                       }  | 
  |  836 |    0 |                }  | 
  |  837 |    0 |                if(CollectionUtils.isNotEmpty(copyRoleIds)) { | 
  |  838 |    0 |                        rms.addAll(getStoredRoleGroupsForGroupIdsAndRoleIds(copyRoleIds, groupIds, null));  | 
  |  839 |     | 
               }  | 
  |  840 |    0 |                return rms;  | 
  |  841 |     | 
           }  | 
  |  842 |     | 
             | 
  |  843 |     | 
       protected boolean principalHasRole(String principalId, List<String> roleIds, AttributeSet qualification, boolean checkDelegations ) { | 
  |  844 |    0 |                if ( StringUtils.isBlank( principalId ) ) { | 
  |  845 |    0 |                        return false;  | 
  |  846 |     | 
               }  | 
  |  847 |    0 |                Set<String> allRoleIds = new HashSet<String>();  | 
  |  848 |     | 
                 | 
  |  849 |    0 |                for ( String roleId : roleIds ) { | 
  |  850 |    0 |                        if ( isRoleActive(roleId) ) { | 
  |  851 |    0 |                                allRoleIds.add(roleId);  | 
  |  852 |     | 
                       }  | 
  |  853 |     | 
               }  | 
  |  854 |     | 
                 | 
  |  855 |    0 |                if ( allRoleIds.isEmpty() ) { | 
  |  856 |    0 |                        return false;  | 
  |  857 |     | 
               }  | 
  |  858 |     | 
                 | 
  |  859 |    0 |                Map<String,RoleImpl> roles = getRoleImplMap(allRoleIds);  | 
  |  860 |     | 
                 | 
  |  861 |    0 |                List<String> copyRoleIds = new ArrayList<String>(allRoleIds);  | 
  |  862 |    0 |                List<RoleMemberImpl> rps = new ArrayList<RoleMemberImpl>();  | 
  |  863 |     | 
                 | 
  |  864 |    0 |                for(String roleId : allRoleIds) { | 
  |  865 |    0 |                        KimRoleTypeService roleTypeService = getRoleTypeService( roleId );  | 
  |  866 |    0 |                        if(roleTypeService != null) { | 
  |  867 |    0 |                                List<String> attributesForExactMatch = roleTypeService.getQualifiersForExactMatch();  | 
  |  868 |    0 |                                if(CollectionUtils.isNotEmpty(attributesForExactMatch)) { | 
  |  869 |    0 |                                        copyRoleIds.remove(roleId);  | 
  |  870 |    0 |                                        rps.addAll(getStoredRolePrincipalsForPrincipalIdAndRoleIds(Collections.singletonList(roleId), principalId, populateQualifiersForExactMatch(qualification, attributesForExactMatch)));  | 
  |  871 |     | 
                               }    | 
  |  872 |     | 
                       }  | 
  |  873 |    0 |                }  | 
  |  874 |    0 |                if(CollectionUtils.isNotEmpty(copyRoleIds)) { | 
  |  875 |    0 |                        rps.addAll(getStoredRolePrincipalsForPrincipalIdAndRoleIds(copyRoleIds, principalId, null));  | 
  |  876 |     | 
               }  | 
  |  877 |     | 
     | 
  |  878 |     | 
                 | 
  |  879 |     | 
                 | 
  |  880 |    0 |                if ( (qualification == null || qualification.isEmpty()) && !rps.isEmpty() ) { | 
  |  881 |    0 |                        return true;  | 
  |  882 |     | 
               }  | 
  |  883 |     | 
     | 
  |  884 |     | 
                 | 
  |  885 |     | 
     | 
  |  886 |     | 
                 | 
  |  887 |     | 
                 | 
  |  888 |    0 |                Map<String,List<RoleMembershipInfo>> roleIdToMembershipMap = new HashMap<String,List<RoleMembershipInfo>>();  | 
  |  889 |    0 |                if ( getRoleIdToMembershipMap( roleIdToMembershipMap, rps ) ) { | 
  |  890 |    0 |                        return true;  | 
  |  891 |     | 
               }  | 
  |  892 |     | 
     | 
  |  893 |     | 
                 | 
  |  894 |    0 |                    for ( String roleId : roleIdToMembershipMap.keySet() ) { | 
  |  895 |     | 
                       try { | 
  |  896 |    0 |                                KimRoleTypeService roleTypeService = getRoleTypeService( roleId );  | 
  |  897 |    0 |                                if ( !roleTypeService.doRoleQualifiersMatchQualification( qualification, roleIdToMembershipMap.get( roleId ) ).isEmpty() ) { | 
  |  898 |    0 |                                        return true;  | 
  |  899 |     | 
                               }  | 
  |  900 |    0 |                        } catch ( Exception ex ) { | 
  |  901 |    0 |                    LOG.warn( "Unable to find role type service with id: " + roleId );  | 
  |  902 |    0 |                }  | 
  |  903 |     | 
                   }  | 
  |  904 |     | 
     | 
  |  905 |     | 
                 | 
  |  906 |    0 |                List<String> principalGroupIds = getIdentityManagementService().getGroupIdsForPrincipal(principalId);  | 
  |  907 |     | 
                 | 
  |  908 |    0 |                if ( !principalGroupIds.isEmpty() ) { | 
  |  909 |    0 |                        List<RoleMemberImpl> rgs = getStoredRoleGroupsUsingExactMatchOnQualification(principalGroupIds, allRoleIds, qualification);   | 
  |  910 |    0 |                            roleIdToMembershipMap.clear();   | 
  |  911 |    0 |                        if ( getRoleIdToMembershipMap( roleIdToMembershipMap, rgs ) ) { | 
  |  912 |    0 |                                return true;  | 
  |  913 |     | 
                       }  | 
  |  914 |     | 
     | 
  |  915 |     | 
                         | 
  |  916 |    0 |                            for ( String roleId : roleIdToMembershipMap.keySet() ) { | 
  |  917 |     | 
                               try { | 
  |  918 |    0 |                                        KimRoleTypeService roleTypeService = getRoleTypeService( roleId );  | 
  |  919 |    0 |                                        if ( !roleTypeService.doRoleQualifiersMatchQualification( qualification, roleIdToMembershipMap.get( roleId ) ).isEmpty() ) { | 
  |  920 |    0 |                                                return true;  | 
  |  921 |     | 
                                       }  | 
  |  922 |    0 |                                } catch ( Exception ex ) { | 
  |  923 |    0 |                        LOG.warn( "Unable to find role type service with id: " + roleId );  | 
  |  924 |    0 |                    }  | 
  |  925 |     | 
                           }  | 
  |  926 |     | 
               }  | 
  |  927 |     | 
     | 
  |  928 |     | 
                 | 
  |  929 |     | 
                 | 
  |  930 |     | 
                 | 
  |  931 |    0 |                List<RoleMemberImpl> rrs = getStoredRoleMembersForRoleIds( roleIds, Role.ROLE_MEMBER_TYPE, null );  | 
  |  932 |    0 |                for ( RoleMemberImpl rr : rrs ) { | 
  |  933 |    0 |                        KimRoleTypeService roleTypeService = getRoleTypeService( rr.getRoleId() );  | 
  |  934 |    0 |                        if ( roleTypeService != null ) { | 
  |  935 |     | 
                                 | 
  |  936 |     | 
                             | 
  |  937 |     | 
                           try { | 
  |  938 |    0 |                                if ( roleTypeService.doesRoleQualifierMatchQualification( qualification, rr.getQualifier() ) ) { | 
  |  939 |    0 |                            RoleImpl memberRole = getRoleImpl( rr.getMemberId() );  | 
  |  940 |    0 |                                                AttributeSet nestedRoleQualification = roleTypeService.convertQualificationForMemberRoles(  | 
  |  941 |     | 
                                                       roles.get(rr.getRoleId()).getNamespaceCode(),  | 
  |  942 |     | 
                                                       roles.get(rr.getRoleId()).getRoleName(),  | 
  |  943 |     | 
                                   memberRole.getNamespaceCode(),  | 
  |  944 |     | 
                                   memberRole.getRoleName(),  | 
  |  945 |     | 
                                   qualification );  | 
  |  946 |    0 |                            ArrayList<String> roleIdTempList = new ArrayList<String>( 1 );  | 
  |  947 |    0 |                            roleIdTempList.add( rr.getMemberId() );  | 
  |  948 |    0 |                                            if ( principalHasRole( principalId, roleIdTempList, nestedRoleQualification, true ) ) { | 
  |  949 |    0 |                                                    return true;  | 
  |  950 |     | 
                                           }  | 
  |  951 |     | 
                                   }          | 
  |  952 |    0 |                                } catch (Exception ex) { | 
  |  953 |    0 |                        LOG.warn("Not able to retrieve RoleTypeService from remote system for role Id: " + rr.getRoleId(), ex); | 
  |  954 |     | 
                         | 
  |  955 |    0 |                    }  | 
  |  956 |     | 
                       } else { | 
  |  957 |     | 
                                 | 
  |  958 |    0 |                                    ArrayList<String> roleIdTempList = new ArrayList<String>( 1 );  | 
  |  959 |    0 |                                    roleIdTempList.add( rr.getMemberId() );  | 
  |  960 |     | 
                                     | 
  |  961 |    0 |                                    if ( principalHasRole( principalId, roleIdTempList, qualification, true ) ) { | 
  |  962 |    0 |                                            return true;  | 
  |  963 |     | 
                                   }  | 
  |  964 |     | 
                       }  | 
  |  965 |     | 
                     | 
  |  966 |    0 |                }  | 
  |  967 |     | 
     | 
  |  968 |     | 
     | 
  |  969 |     | 
                 | 
  |  970 |     | 
                 | 
  |  971 |     | 
                 | 
  |  972 |     | 
     | 
  |  973 |     | 
                 | 
  |  974 |    0 |                for ( String roleId : allRoleIds ) { | 
  |  975 |    0 |                            RoleImpl role = roles.get( roleId );  | 
  |  976 |    0 |                        KimRoleTypeService roleTypeService = getRoleTypeService( roleId );  | 
  |  977 |     | 
                         | 
  |  978 |     | 
                         | 
  |  979 |     | 
                 | 
  |  980 |     | 
               try { | 
  |  981 |    0 |                            if ( isApplicationRoleType(role.getKimTypeId(), roleTypeService)  ) { | 
  |  982 |    0 |                                    if ( roleTypeService.hasApplicationRole(principalId, principalGroupIds, role.getNamespaceCode(), role.getRoleName(), qualification) ) { | 
  |  983 |    0 |                                            return true;  | 
  |  984 |     | 
                                   }  | 
  |  985 |     | 
                           }  | 
  |  986 |    0 |                } catch (Exception ex) { | 
  |  987 |    0 |                    LOG.warn("Not able to retrieve RoleTypeService from remote system for role Id: " + roleId, ex); | 
  |  988 |     | 
                     | 
  |  989 |    0 |                }  | 
  |  990 |    0 |                }  | 
  |  991 |     | 
     | 
  |  992 |     | 
                 | 
  |  993 |    0 |                if ( checkDelegations ) { | 
  |  994 |    0 |                        if ( matchesOnDelegation( allRoleIds, principalId, principalGroupIds, qualification ) ) { | 
  |  995 |    0 |                                return true;  | 
  |  996 |     | 
                       }  | 
  |  997 |     | 
               }  | 
  |  998 |     | 
     | 
  |  999 |     | 
                 | 
  |  1000 |     | 
                 | 
  |  1001 |    0 |                return false;  | 
  |  1002 |     | 
       }  | 
  |  1003 |     | 
     | 
  |  1004 |     | 
         | 
  |  1005 |     | 
     | 
  |  1006 |     | 
     | 
  |  1007 |     | 
     | 
  |  1008 |     | 
     | 
  |  1009 |     | 
     | 
  |  1010 |     | 
     | 
  |  1011 |     | 
     | 
  |  1012 |     | 
     | 
  |  1013 |     | 
     | 
  |  1014 |     | 
     | 
  |  1015 |     | 
     | 
  |  1016 |     | 
     | 
  |  1017 |     | 
     | 
  |  1018 |     | 
     | 
  |  1019 |     | 
     | 
  |  1020 |     | 
     | 
  |  1021 |     | 
       protected boolean matchesOnDelegation( Set<String> allRoleIds, String principalId, List<String> principalGroupIds, AttributeSet qualification ) { | 
  |  1022 |     | 
                 | 
  |  1023 |    0 |                Map<String,KimDelegationImpl> delegations = getStoredDelegationImplMapFromRoleIds(allRoleIds);  | 
  |  1024 |     | 
                 | 
  |  1025 |    0 |                for ( KimDelegationImpl delegation : delegations.values() ) { | 
  |  1026 |     | 
                     | 
  |  1027 |    0 |                        if ( !delegation.isActive() ) { | 
  |  1028 |    0 |                                continue;  | 
  |  1029 |     | 
                       }  | 
  |  1030 |    0 |                        KimRoleTypeService roleTypeService = getRoleTypeService( delegation.getRoleId() );  | 
  |  1031 |    0 |                        for ( KimDelegationMemberImpl dmi : delegation.getMembers() ) { | 
  |  1032 |    0 |                                if ( !dmi.isActive() ) { | 
  |  1033 |    0 |                                        continue;  | 
  |  1034 |     | 
                               }  | 
  |  1035 |     | 
                                 | 
  |  1036 |    0 |                                if ( dmi.getMemberTypeCode().equals( Role.PRINCIPAL_MEMBER_TYPE )  | 
  |  1037 |     | 
                                               && !dmi.getMemberId().equals( principalId ) ) { | 
  |  1038 |    0 |                                        continue;   | 
  |  1039 |     | 
                               }  | 
  |  1040 |     | 
                                 | 
  |  1041 |    0 |                                if ( dmi.getMemberTypeCode().equals( Role.GROUP_MEMBER_TYPE )  | 
  |  1042 |     | 
                                               && !principalGroupIds.contains( dmi.getMemberId() ) ) { | 
  |  1043 |    0 |                                        continue;   | 
  |  1044 |     | 
                               }  | 
  |  1045 |     | 
                                 | 
  |  1046 |    0 |                                if ( dmi.getMemberTypeCode().equals( Role.ROLE_MEMBER_TYPE )  | 
  |  1047 |     | 
                                               && !principalHasRole( principalId, Collections.singletonList( dmi.getMemberId() ), qualification, false ) ) { | 
  |  1048 |    0 |                                        continue;   | 
  |  1049 |     | 
                               }  | 
  |  1050 |     | 
                                 | 
  |  1051 |     | 
     | 
  |  1052 |     | 
                                 | 
  |  1053 |     | 
                                 | 
  |  1054 |     | 
                                 | 
  |  1055 |     | 
                                 | 
  |  1056 |     | 
                                    | 
  |  1057 |     | 
                     | 
  |  1058 |     | 
                               try { | 
  |  1059 |    0 |                                        if ( roleTypeService != null && !roleTypeService.doesRoleQualifierMatchQualification( qualification, dmi.getQualifier() ) ) { | 
  |  1060 |    0 |                                                continue;   | 
  |  1061 |     | 
                                       }  | 
  |  1062 |    0 |                                } catch (Exception ex) { | 
  |  1063 |    0 |                                        LOG.warn("Unable to call doesRoleQualifierMatchQualification on role type service for role Id: " + delegation.getRoleId() + " / " + qualification + " / " + dmi.getQualifier(), ex); | 
  |  1064 |    0 |                                        continue;  | 
  |  1065 |    0 |                                }  | 
  |  1066 |     | 
                                 | 
  |  1067 |     | 
                                         | 
  |  1068 |     | 
                                     | 
  |  1069 |    0 |                                    KimDelegationTypeService delegationTypeService = getDelegationTypeService( dmi.getDelegationId());  | 
  |  1070 |     | 
                                     | 
  |  1071 |    0 |                                    if ( delegationTypeService != null && !delegationTypeService.doesDelegationQualifierMatchQualification(qualification, dmi.getQualifier())) { | 
  |  1072 |    0 |                                            continue;   | 
  |  1073 |     | 
                                   }  | 
  |  1074 |     | 
                                     | 
  |  1075 |     | 
                                     | 
  |  1076 |    0 |                                    if ( StringUtils.isNotBlank( dmi.getRoleMemberId() ) ) { | 
  |  1077 |    0 |                                            RoleMemberImpl rm = getRoleMemberImpl( dmi.getRoleMemberId() );  | 
  |  1078 |    0 |                                            if ( rm != null ) { | 
  |  1079 |     | 
                                                     | 
  |  1080 |     | 
                                                     | 
  |  1081 |     | 
                                                     | 
  |  1082 |     | 
                                                     | 
  |  1083 |     | 
                                                     | 
  |  1084 |     | 
                                                     | 
  |  1085 |    0 |                                                    if ( !rm.isActive() ) { | 
  |  1086 |    0 |                                                            continue;  | 
  |  1087 |     | 
                                                   }  | 
  |  1088 |    0 |                                                    AttributeSet roleQualifier = rm.getQualifier();  | 
  |  1089 |     | 
                                                    | 
  |  1090 |     | 
                                    | 
  |  1091 |     | 
                                                  try { | 
  |  1092 |    0 |                                                           if (roleTypeService != null && !roleTypeService.doesRoleQualifierMatchQualification(qualification, roleQualifier) ) { | 
  |  1093 |    0 |                                                                   continue;  | 
  |  1094 |     | 
                                                          }  | 
  |  1095 |    0 |                                                   } catch (Exception ex) { | 
  |  1096 |    0 |                                                           LOG.warn("Unable to call doesRoleQualifierMatchQualification on role type service for role Id: " + delegation.getRoleId() + " / " + qualification + " / " + roleQualifier, ex); | 
  |  1097 |    0 |                                                    continue;  | 
  |  1098 |    0 |                                            }  | 
  |  1099 |    0 |                                    } else { | 
  |  1100 |    0 |                                            LOG.warn( "Unknown role member ID cited in the delegation member table:" );  | 
  |  1101 |    0 |                                            LOG.warn( "       delegationMemberId: " + dmi.getDelegationMemberId() + " / roleMemberId: " + dmi.getRoleMemberId() );  | 
  |  1102 |     | 
                                   }  | 
  |  1103 |     | 
                           }  | 
  |  1104 |     | 
                             | 
  |  1105 |    0 |                            return true;  | 
  |  1106 |     | 
                       }  | 
  |  1107 |    0 |                }  | 
  |  1108 |    0 |                return false;  | 
  |  1109 |     | 
       }  | 
  |  1110 |     | 
     | 
  |  1111 |     | 
         | 
  |  1112 |     | 
         | 
  |  1113 |     | 
         | 
  |  1114 |     | 
         | 
  |  1115 |     | 
     | 
  |  1116 |     | 
             | 
  |  1117 |     | 
     | 
  |  1118 |     | 
       public List<RoleImpl> getRolesSearchResults(java.util.Map<String,String> fieldValues) { | 
  |  1119 |    0 |                return getRoleDao().getRoles(fieldValues);  | 
  |  1120 |     | 
       }  | 
  |  1121 |     | 
     | 
  |  1122 |     | 
         | 
  |  1123 |     | 
     | 
  |  1124 |     | 
     | 
  |  1125 |     | 
       public void roleInactivated(String roleId){ | 
  |  1126 |    0 |                Timestamp yesterday = new Timestamp( new java.util.Date().getTime() - (24*60*60*1000) );  | 
  |  1127 |    0 |                List<String> roleIds = new ArrayList<String>();  | 
  |  1128 |    0 |                roleIds.add(roleId);  | 
  |  1129 |    0 |                inactivateRoleMemberships(roleIds, yesterday);  | 
  |  1130 |    0 |                inactivateRoleDelegations(roleIds, yesterday);  | 
  |  1131 |    0 |                inactivateMembershipsForRoleAsMember(roleIds, yesterday);  | 
  |  1132 |    0 |        }  | 
  |  1133 |     | 
         | 
  |  1134 |     | 
       private void inactivateRoleMemberships(List<String> roleIds, Timestamp yesterday){ | 
  |  1135 |    0 |                List<RoleMemberImpl> roleMembers = getStoredRoleMembersForRoleIds(roleIds, null, null);  | 
  |  1136 |    0 |                for(RoleMemberImpl rm: roleMembers){ | 
  |  1137 |    0 |                        rm.setActiveToDate(yesterday);  | 
  |  1138 |     | 
               }  | 
  |  1139 |    0 |                getBusinessObjectService().save(roleMembers);  | 
  |  1140 |    0 |                getIdentityManagementNotificationService().roleUpdated();  | 
  |  1141 |    0 |        }  | 
  |  1142 |     | 
     | 
  |  1143 |     | 
       private void inactivateMembershipsForRoleAsMember(List<String> roleIds, Timestamp yesterday){ | 
  |  1144 |    0 |                List<RoleMemberImpl> roleMembers = getStoredRoleMembershipsForRoleIdsAsMembers(roleIds, null);  | 
  |  1145 |    0 |                for(RoleMemberImpl rm: roleMembers){ | 
  |  1146 |    0 |                        rm.setActiveToDate(yesterday);  | 
  |  1147 |     | 
               }  | 
  |  1148 |    0 |                getBusinessObjectService().save(roleMembers);  | 
  |  1149 |    0 |                getIdentityManagementNotificationService().roleUpdated();  | 
  |  1150 |    0 |        }  | 
  |  1151 |     | 
     | 
  |  1152 |     | 
       private void inactivateRoleDelegations(List<String> roleIds, Timestamp yesterday){ | 
  |  1153 |    0 |                List<KimDelegationImpl> delegations = getStoredDelegationImplsForRoleIds(roleIds);  | 
  |  1154 |    0 |                for(KimDelegationImpl delegation: delegations){ | 
  |  1155 |    0 |                        delegation.setActive(false);  | 
  |  1156 |    0 |                        for(KimDelegationMemberImpl delegationMember: delegation.getMembers()){ | 
  |  1157 |    0 |                                delegationMember.setActiveToDate(yesterday);  | 
  |  1158 |     | 
                       }  | 
  |  1159 |     | 
               }  | 
  |  1160 |    0 |                getBusinessObjectService().save(delegations);  | 
  |  1161 |    0 |                getIdentityManagementNotificationService().delegationUpdated();  | 
  |  1162 |    0 |        }  | 
  |  1163 |     | 
         | 
  |  1164 |     | 
         | 
  |  1165 |     | 
     | 
  |  1166 |     | 
     | 
  |  1167 |     | 
       public void principalInactivated(String principalId) { | 
  |  1168 |    0 |                Timestamp yesterday = new Timestamp( System.currentTimeMillis() - (24*60*60*1000) );  | 
  |  1169 |    0 |                inactivatePrincipalRoleMemberships(principalId, yesterday);  | 
  |  1170 |    0 |                inactivatePrincipalGroupMemberships(principalId, yesterday);  | 
  |  1171 |    0 |                inactivatePrincipalDelegations(principalId, yesterday);  | 
  |  1172 |    0 |                inactivateApplicationRoleMemberships( principalId, yesterday );  | 
  |  1173 |    0 |        }  | 
  |  1174 |     | 
     | 
  |  1175 |     | 
       @SuppressWarnings("unchecked") | 
  |  1176 |     | 
           protected void inactivateApplicationRoleMemberships( String principalId, Timestamp yesterday){ | 
  |  1177 |     | 
                 | 
  |  1178 |    0 |                Collection<KimTypeInfo> types = KIMServiceLocatorWeb.getTypeInfoService().getAllTypes();  | 
  |  1179 |     | 
                 | 
  |  1180 |    0 |                ArrayList<KimTypeInfo> applicationRoleTypes = new ArrayList<KimTypeInfo>( types.size() );  | 
  |  1181 |    0 |                for ( KimTypeInfo typeInfo : types ) { | 
  |  1182 |    0 |                        KimRoleTypeService service = getRoleTypeService(typeInfo);  | 
  |  1183 |     | 
                   try { | 
  |  1184 |    0 |                                if ( isApplicationRoleType(typeInfo.getKimTypeId(), service)) { | 
  |  1185 |    0 |                                                applicationRoleTypes.add(typeInfo);  | 
  |  1186 |     | 
                                       }  | 
  |  1187 |    0 |                    }catch(Exception e) { | 
  |  1188 |    0 |                                LOG.warn(e.getMessage(), e);  | 
  |  1189 |    0 |                        }  | 
  |  1190 |    0 |                }                          | 
  |  1191 |     | 
                             | 
  |  1192 |    0 |                Map<String,Object> roleLookupMap = new HashMap<String, Object>(2);  | 
  |  1193 |    0 |                roleLookupMap.put( KIMPropertyConstants.Role.ACTIVE, "Y");  | 
  |  1194 |     | 
                 | 
  |  1195 |    0 |                for ( KimTypeInfo typeInfo : applicationRoleTypes ) { | 
  |  1196 |    0 |                        KimRoleTypeService service = getRoleTypeService(typeInfo);  | 
  |  1197 |     | 
                         | 
  |  1198 |    0 |                    roleLookupMap.put( KIMPropertyConstants.Role.KIM_TYPE_ID, typeInfo.getKimTypeId());  | 
  |  1199 |    0 |                        Collection<RoleImpl> roles = getBusinessObjectService().findMatching( RoleImpl.class, roleLookupMap);  | 
  |  1200 |     | 
                     | 
  |  1201 |    0 |                        for ( RoleImpl role : roles ) { | 
  |  1202 |     | 
                             | 
  |  1203 |    0 |                                service.principalInactivated(principalId, role.getNamespaceCode(), role.getRoleName());  | 
  |  1204 |     | 
                       }  | 
  |  1205 |    0 |                }  | 
  |  1206 |    0 |        }  | 
  |  1207 |     | 
         | 
  |  1208 |     | 
       protected void inactivatePrincipalRoleMemberships(String principalId, Timestamp yesterday){ | 
  |  1209 |     | 
                 | 
  |  1210 |    0 |                List<RoleMemberImpl> roleMembers = getStoredRolePrincipalsForPrincipalIdAndRoleIds(null, principalId, null);  | 
  |  1211 |    0 |                Set<String> roleIds = new HashSet<String>( roleMembers.size() );  | 
  |  1212 |    0 |                for ( RoleMemberImpl rm : roleMembers ) { | 
  |  1213 |    0 |                        rm.setActiveToDate(yesterday);  | 
  |  1214 |    0 |                        roleIds.add(rm.getRoleId());   | 
  |  1215 |     | 
               }  | 
  |  1216 |    0 |                getBusinessObjectService().save(roleMembers);  | 
  |  1217 |     | 
                 | 
  |  1218 |    0 |                for ( String roleId : roleIds ) { | 
  |  1219 |    0 |                        RoleImpl role = getRoleImpl(roleId);  | 
  |  1220 |    0 |                        KimRoleTypeService roleTypeService = getRoleTypeService(roleId);  | 
  |  1221 |     | 
                       try { | 
  |  1222 |    0 |                                if ( roleTypeService != null ) { | 
  |  1223 |    0 |                                        roleTypeService.principalInactivated( principalId, role.getNamespaceCode(), role.getRoleName() );  | 
  |  1224 |     | 
                               }  | 
  |  1225 |    0 |                        } catch ( Exception ex ) { | 
  |  1226 |    0 |                                LOG.error( "Problem notifying role type service of principal inactivation: " + role.getKimRoleType().getKimTypeServiceName(), ex );  | 
  |  1227 |    0 |                        }  | 
  |  1228 |    0 |                }  | 
  |  1229 |    0 |                getIdentityManagementNotificationService().roleUpdated();  | 
  |  1230 |    0 |        }  | 
  |  1231 |     | 
         | 
  |  1232 |     | 
       protected void inactivatePrincipalGroupMemberships(String principalId, Timestamp yesterday){ | 
  |  1233 |    0 |            List<GroupMembershipInfo> groupMemberInfos = getRoleDao().getGroupPrincipalsForPrincipalIdAndGroupIds(null, principalId);  | 
  |  1234 |    0 |            List<GroupMemberImpl> groupMembers = new ArrayList<GroupMemberImpl>(groupMemberInfos.size());  | 
  |  1235 |    0 |            for ( GroupMembershipInfo rm : groupMemberInfos ) { | 
  |  1236 |    0 |                rm.setActiveToDate( new Date(yesterday.getTime()) );  | 
  |  1237 |    0 |                groupMembers.add(toGroupMemberImpl(rm));  | 
  |  1238 |     | 
           }  | 
  |  1239 |     | 
             | 
  |  1240 |    0 |                getBusinessObjectService().save(groupMembers);  | 
  |  1241 |    0 |        }  | 
  |  1242 |     | 
     | 
  |  1243 |     | 
       protected void inactivatePrincipalDelegations(String principalId, Timestamp yesterday){ | 
  |  1244 |    0 |                List<KimDelegationMemberImpl> delegationMembers = getStoredDelegationPrincipalsForPrincipalIdAndDelegationIds(null, principalId);  | 
  |  1245 |    0 |                for ( KimDelegationMemberImpl rm : delegationMembers ) { | 
  |  1246 |    0 |                        rm.setActiveToDate(yesterday);  | 
  |  1247 |     | 
               }  | 
  |  1248 |    0 |                getBusinessObjectService().save(delegationMembers);  | 
  |  1249 |    0 |                getIdentityManagementNotificationService().delegationUpdated();  | 
  |  1250 |    0 |        }  | 
  |  1251 |     | 
     | 
  |  1252 |     | 
       public List<RoleMembershipInfo> getFirstLevelRoleMembers(List<String> roleIds){ | 
  |  1253 |    0 |                List<RoleMemberImpl> rms = getStoredRoleMembersForRoleIds(roleIds, null, null);  | 
  |  1254 |    0 |                List<RoleMembershipInfo> roleMembershipInfoList = new ArrayList<RoleMembershipInfo>();  | 
  |  1255 |    0 |                for ( RoleMemberImpl rm : rms ) { | 
  |  1256 |    0 |                        roleMembershipInfoList.add(new RoleMembershipInfo( rm.getRoleId(), rm.getRoleMemberId(), rm.getMemberId(), rm.getMemberTypeCode(), rm.getQualifier()));  | 
  |  1257 |     | 
               }  | 
  |  1258 |    0 |                return roleMembershipInfoList;  | 
  |  1259 |     | 
       }  | 
  |  1260 |     | 
         | 
  |  1261 |     | 
     | 
  |  1262 |     | 
         | 
  |  1263 |     | 
     | 
  |  1264 |     | 
     | 
  |  1265 |     | 
     | 
  |  1266 |     | 
     | 
  |  1267 |     | 
     | 
  |  1268 |     | 
       public void groupInactivated(String groupId) { | 
  |  1269 |    0 |                Timestamp yesterday = new Timestamp( System.currentTimeMillis() - (24*60*60*1000) );  | 
  |  1270 |    0 |                List<String> groupIds = new ArrayList<String>();  | 
  |  1271 |    0 |                groupIds.add(groupId);  | 
  |  1272 |    0 |                inactivatePrincipalGroupMemberships(groupIds, yesterday);  | 
  |  1273 |    0 |                inactivateGroupRoleMemberships(groupIds, yesterday);  | 
  |  1274 |    0 |        }  | 
  |  1275 |     | 
         | 
  |  1276 |     | 
       protected void inactivatePrincipalGroupMemberships(List<String> groupIds, Timestamp yesterday){ | 
  |  1277 |    0 |            List<GroupMembershipInfo> groupMemberInfos = getRoleDao().getGroupMembers(groupIds);  | 
  |  1278 |    0 |            List<GroupMemberImpl> groupMembers = new ArrayList<GroupMemberImpl>(groupMemberInfos.size());  | 
  |  1279 |    0 |            for ( GroupMembershipInfo rm : groupMemberInfos ) { | 
  |  1280 |    0 |                rm.setActiveToDate( new Date(yesterday.getTime()) );  | 
  |  1281 |    0 |                groupMembers.add(toGroupMemberImpl(rm));  | 
  |  1282 |     | 
           }  | 
  |  1283 |    0 |                getBusinessObjectService().save(groupMembers);  | 
  |  1284 |    0 |        }  | 
  |  1285 |     | 
     | 
  |  1286 |     | 
       protected void inactivateGroupRoleMemberships(List<String> groupIds, Timestamp yesterday){ | 
  |  1287 |    0 |                List<RoleMemberImpl> roleMembersOfGroupType = getStoredRoleGroupsForGroupIdsAndRoleIds(null, groupIds, null);  | 
  |  1288 |    0 |                for(RoleMemberImpl rm: roleMembersOfGroupType){ | 
  |  1289 |    0 |                        rm.setActiveToDate(yesterday);  | 
  |  1290 |     | 
               }  | 
  |  1291 |    0 |                getBusinessObjectService().save(roleMembersOfGroupType);  | 
  |  1292 |    0 |                getIdentityManagementNotificationService().roleUpdated();  | 
  |  1293 |    0 |        }  | 
  |  1294 |     | 
         | 
  |  1295 |     | 
       protected GroupMemberImpl toGroupMemberImpl(GroupMembershipInfo kimGroupMember) { | 
  |  1296 |    0 |            GroupMemberImpl groupMemberImpl = null;  | 
  |  1297 |     | 
     | 
  |  1298 |    0 |            if (kimGroupMember != null) { | 
  |  1299 |    0 |                groupMemberImpl = new GroupMemberImpl();  | 
  |  1300 |    0 |                groupMemberImpl.setGroupId(kimGroupMember.getGroupId());  | 
  |  1301 |    0 |                groupMemberImpl.setGroupMemberId(kimGroupMember.getGroupMemberId());  | 
  |  1302 |    0 |                groupMemberImpl.setMemberId(kimGroupMember.getMemberId());  | 
  |  1303 |    0 |                groupMemberImpl.setMemberTypeCode(kimGroupMember.getMemberTypeCode());  | 
  |  1304 |    0 |                            if (kimGroupMember.getActiveFromDate() != null) { | 
  |  1305 |    0 |                                    groupMemberImpl.setActiveFromDate(new java.sql.Timestamp(kimGroupMember.getActiveFromDate().getTime()));  | 
  |  1306 |     | 
                           }  | 
  |  1307 |    0 |                            if (kimGroupMember.getActiveToDate() != null) { | 
  |  1308 |    0 |                                    groupMemberImpl.setActiveToDate(new java.sql.Timestamp(kimGroupMember.getActiveToDate().getTime()));  | 
  |  1309 |     | 
                           }  | 
  |  1310 |    0 |                groupMemberImpl.setVersionNumber(kimGroupMember.getVersionNumber());  | 
  |  1311 |     | 
           }  | 
  |  1312 |     | 
     | 
  |  1313 |    0 |            return groupMemberImpl;  | 
  |  1314 |     | 
       }  | 
  |  1315 |     | 
     | 
  |  1316 |     | 
       public List<RoleMembershipInfo> findRoleMembers(Map<String,String> fieldValues){ | 
  |  1317 |    0 |                return getRoleDao().getRoleMembers(fieldValues);  | 
  |  1318 |     | 
       }  | 
  |  1319 |     | 
         | 
  |  1320 |     | 
       public List<DelegateMemberCompleteInfo> findDelegateMembersCompleteInfo(final Map<String, String> fieldValues){ | 
  |  1321 |    0 |                List<DelegateMemberCompleteInfo> delegateMembersCompleteInfo = new ArrayList<DelegateMemberCompleteInfo>();  | 
  |  1322 |     | 
               DelegateMemberCompleteInfo delegateMemberCompleteInfo;  | 
  |  1323 |    0 |                List<KimDelegationImpl> delegations = (List<KimDelegationImpl>)getLookupService().findCollectionBySearchHelper(  | 
  |  1324 |     | 
                                   KimDelegationImpl.class, fieldValues, true);  | 
  |  1325 |    0 |                if(delegations!=null && !delegations.isEmpty()){ | 
  |  1326 |    0 |                        Map<String, String> delegationMemberFieldValues = new HashMap<String, String>();  | 
  |  1327 |    0 |                        for(String key: fieldValues.keySet()){ | 
  |  1328 |    0 |                                if(key.startsWith(KimConstants.KimUIConstants.MEMBER_ID_PREFIX)){ | 
  |  1329 |    0 |                                        delegationMemberFieldValues.put(  | 
  |  1330 |     | 
                                                       key.substring(key.indexOf(  | 
  |  1331 |     | 
                                                       KimConstants.KimUIConstants.MEMBER_ID_PREFIX)+KimConstants.KimUIConstants.MEMBER_ID_PREFIX.length()),   | 
  |  1332 |     | 
                                                       fieldValues.get(key));  | 
  |  1333 |     | 
                               }  | 
  |  1334 |     | 
                       }  | 
  |  1335 |    0 |                            StringBuffer memberQueryString = new StringBuffer();  | 
  |  1336 |    0 |                        for(KimDelegationImpl delegation: delegations)  | 
  |  1337 |    0 |                                memberQueryString.append(delegation.getDelegationId()+KimConstants.KimUIConstants.OR_OPERATOR);  | 
  |  1338 |    0 |                        delegationMemberFieldValues.put(KimConstants.PrimaryKeyConstants.DELEGATION_ID,   | 
  |  1339 |     | 
                                       KimCommonUtilsInternal.stripEnd(memberQueryString.toString(), KimConstants.KimUIConstants.OR_OPERATOR));  | 
  |  1340 |    0 |                        List<KimDelegationMemberImpl> delegateMembers = (List<KimDelegationMemberImpl>)getLookupService().findCollectionBySearchHelper(  | 
  |  1341 |     | 
                                           KimDelegationMemberImpl.class, delegationMemberFieldValues, true);  | 
  |  1342 |     | 
                       KimDelegationImpl delegationTemp;  | 
  |  1343 |    0 |                        for(KimDelegationMemberImpl delegateMember: delegateMembers){ | 
  |  1344 |    0 |                                delegateMemberCompleteInfo = delegateMember.toSimpleInfo();  | 
  |  1345 |    0 |                                delegationTemp = getDelegationImpl(delegations, delegateMember.getDelegationId());  | 
  |  1346 |    0 |                                delegateMemberCompleteInfo.setRoleId(delegationTemp.getRoleId());  | 
  |  1347 |    0 |                                delegateMemberCompleteInfo.setDelegationTypeCode(delegationTemp.getDelegationTypeCode());  | 
  |  1348 |    0 |                                    Object member = getMember(delegateMemberCompleteInfo.getMemberTypeCode(), delegateMemberCompleteInfo.getMemberId());  | 
  |  1349 |    0 |                                    delegateMemberCompleteInfo.setMemberName(getMemberName(member));  | 
  |  1350 |    0 |                                    delegateMemberCompleteInfo.setMemberNamespaceCode(getMemberNamespaceCode(member));  | 
  |  1351 |    0 |                                    delegateMembersCompleteInfo.add(delegateMemberCompleteInfo);  | 
  |  1352 |    0 |                        }  | 
  |  1353 |     | 
     | 
  |  1354 |     | 
               }  | 
  |  1355 |    0 |                return delegateMembersCompleteInfo;  | 
  |  1356 |     | 
       }  | 
  |  1357 |     | 
     | 
  |  1358 |     | 
       public DelegateTypeInfo getDelegateTypeInfo(String roleId, String delegationTypeCode){ | 
  |  1359 |    0 |                KimDelegationImpl delegation = getDelegationOfType(roleId, delegationTypeCode);  | 
  |  1360 |    0 |                if(delegation==null) return null;  | 
  |  1361 |    0 |                return delegation.toSimpleInfo();  | 
  |  1362 |     | 
       }  | 
  |  1363 |     | 
     | 
  |  1364 |     | 
       public DelegateTypeInfo getDelegateTypeInfoById(String delegationId){ | 
  |  1365 |    0 |                    if(delegationId==null) return null;  | 
  |  1366 |    0 |                    KimDelegationImpl delegation = getKimDelegationImpl(delegationId);  | 
  |  1367 |    0 |                if(delegation==null) return null;  | 
  |  1368 |    0 |            return delegation.toSimpleInfo();  | 
  |  1369 |     | 
       }  | 
  |  1370 |     | 
     | 
  |  1371 |     | 
           public List<DelegateMemberCompleteInfo> getDelegationMembersByDelegationId(String delegationId){ | 
  |  1372 |    0 |                    KimDelegationImpl delegation = getKimDelegationImpl(delegationId);  | 
  |  1373 |    0 |            if(delegation==null) return null;  | 
  |  1374 |     | 
             | 
  |  1375 |    0 |            return getDelegationInfoForDelegation(delegation);  | 
  |  1376 |     | 
           }  | 
  |  1377 |     | 
             | 
  |  1378 |     | 
           public DelegateMemberCompleteInfo getDelegationMemberByDelegationAndMemberId(String delegationId, String delegationMemberId){ | 
  |  1379 |    0 |                    KimDelegationImpl delegation = getKimDelegationImpl(delegationId);  | 
  |  1380 |    0 |            KimDelegationMemberImpl delegationMember = getKimDelegationMemberImplByDelegationAndId(delegationId, delegationMemberId);  | 
  |  1381 |     | 
     | 
  |  1382 |    0 |            return getDelegateCompleteInfo(delegation, delegationMember);  | 
  |  1383 |     | 
           }  | 
  |  1384 |     | 
             | 
  |  1385 |     | 
           public DelegateMemberCompleteInfo getDelegationMemberById(@WebParam(name="delegationMemberId") String delegationMemberId){ | 
  |  1386 |    0 |                    KimDelegationMemberImpl delegationMember = getKimDelegationMemberImpl(delegationMemberId);  | 
  |  1387 |    0 |            if(delegationMember==null) return null;  | 
  |  1388 |     | 
             | 
  |  1389 |    0 |            KimDelegationImpl delegation = getKimDelegationImpl(delegationMember.getDelegationId());  | 
  |  1390 |     | 
     | 
  |  1391 |    0 |            return getDelegateCompleteInfo(delegation, delegationMember);  | 
  |  1392 |     | 
           }  | 
  |  1393 |     | 
     | 
  |  1394 |     | 
           private List<DelegateMemberCompleteInfo> getDelegationInfoForDelegation(KimDelegationImpl delegation){ | 
  |  1395 |    0 |                    if(delegation==null || delegation.getMembers()==null) return null;  | 
  |  1396 |    0 |            List<DelegateMemberCompleteInfo> delegateInfoList = new ArrayList<DelegateMemberCompleteInfo>();  | 
  |  1397 |    0 |                    for(KimDelegationMemberImpl delegationMember: delegation.getMembers()){ | 
  |  1398 |    0 |                    delegateInfoList.add(getDelegateCompleteInfo(delegation, delegationMember));  | 
  |  1399 |     | 
           }  | 
  |  1400 |    0 |            return delegateInfoList;  | 
  |  1401 |     | 
           }  | 
  |  1402 |     | 
     | 
  |  1403 |     | 
           private DelegateMemberCompleteInfo getDelegateCompleteInfo(KimDelegationImpl delegation, KimDelegationMemberImpl delegationMember){ | 
  |  1404 |    0 |                    if(delegation==null || delegationMember==null) return null;  | 
  |  1405 |    0 |                    DelegateMemberCompleteInfo delegateMemberCompleteInfo = delegationMember.toSimpleInfo();  | 
  |  1406 |    0 |                    delegateMemberCompleteInfo.setDelegationTypeCode(delegation.getDelegationTypeCode());  | 
  |  1407 |    0 |                    Object member = getMember(delegationMember.getMemberTypeCode(), delegationMember.getMemberId());  | 
  |  1408 |    0 |                    delegateMemberCompleteInfo.setMemberName(getMemberName(member));  | 
  |  1409 |    0 |                    delegateMemberCompleteInfo.setMemberNamespaceCode(getMemberNamespaceCode(member));  | 
  |  1410 |    0 |                    return delegateMemberCompleteInfo;  | 
  |  1411 |     | 
           }  | 
  |  1412 |     | 
     | 
  |  1413 |     | 
           public List<RoleResponsibilityInfo> getRoleResponsibilities(String roleId){ | 
  |  1414 |    0 |                    Map<String, String> criteria = new HashMap<String, String>(1);                  | 
  |  1415 |    0 |                    criteria.put(KimConstants.PrimaryKeyConstants.ROLE_ID, roleId);  | 
  |  1416 |    0 |                    List<RoleResponsibilityImpl> responsibilityImpls = (List<RoleResponsibilityImpl>)  | 
  |  1417 |     | 
                           getBusinessObjectService().findMatching(RoleResponsibilityImpl.class, criteria);  | 
  |  1418 |    0 |                    List<RoleResponsibilityInfo> roleResponsibilities = new ArrayList<RoleResponsibilityInfo>();  | 
  |  1419 |     | 
                   RoleResponsibilityInfo roleResponsibilityInfo;  | 
  |  1420 |    0 |                    for(RoleResponsibilityImpl roleResponsibilityImpl: responsibilityImpls){ | 
  |  1421 |    0 |                            roleResponsibilityInfo = new RoleResponsibilityInfo();  | 
  |  1422 |    0 |                            KimCommonUtilsInternal.copyProperties(roleResponsibilityInfo, roleResponsibilityImpl);  | 
  |  1423 |    0 |                            roleResponsibilities.add(roleResponsibilityInfo);  | 
  |  1424 |     | 
                   }  | 
  |  1425 |    0 |                    return roleResponsibilities;  | 
  |  1426 |     | 
           }  | 
  |  1427 |     | 
     | 
  |  1428 |     | 
       public void applicationRoleMembershipChanged( String roleId ) { | 
  |  1429 |    0 |                getResponsibilityInternalService().updateActionRequestsForRoleChange(roleId);  | 
  |  1430 |    0 |        }  | 
  |  1431 |     | 
     | 
  |  1432 |     | 
   }  |