001    /**
002     * Copyright 2005-2013 The Kuali Foundation
003     *
004     * Licensed under the Educational Community License, Version 2.0 (the "License");
005     * you may not use this file except in compliance with the License.
006     * You may obtain a copy of the License at
007     *
008     * http://www.opensource.org/licenses/ecl2.php
009     *
010     * Unless required by applicable law or agreed to in writing, software
011     * distributed under the License is distributed on an "AS IS" BASIS,
012     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013     * See the License for the specific language governing permissions and
014     * limitations under the License.
015     */
016    package org.kuali.rice.kim.service.impl;
017    
018    import org.apache.commons.collections.CollectionUtils;
019    import org.apache.commons.lang.StringUtils;
020    import org.kuali.rice.core.api.membership.MemberType;
021    import org.kuali.rice.kim.api.KimConstants;
022    import org.kuali.rice.kim.api.group.Group;
023    import org.kuali.rice.kim.api.identity.address.EntityAddress;
024    import org.kuali.rice.kim.api.identity.affiliation.EntityAffiliation;
025    import org.kuali.rice.kim.api.identity.email.EntityEmail;
026    import org.kuali.rice.kim.api.identity.employment.EntityEmployment;
027    import org.kuali.rice.kim.api.identity.entity.Entity;
028    import org.kuali.rice.kim.api.identity.name.EntityName;
029    import org.kuali.rice.kim.api.identity.phone.EntityPhone;
030    import org.kuali.rice.kim.api.identity.principal.Principal;
031    import org.kuali.rice.kim.api.identity.type.EntityTypeContactInfo;
032    import org.kuali.rice.kim.api.role.Role;
033    import org.kuali.rice.kim.api.services.KimApiServiceLocator;
034    import org.kuali.rice.kim.bo.ui.KimDocumentRoleMember;
035    import org.kuali.rice.kim.bo.ui.PersonDocumentAddress;
036    import org.kuali.rice.kim.bo.ui.PersonDocumentAffiliation;
037    import org.kuali.rice.kim.bo.ui.PersonDocumentEmail;
038    import org.kuali.rice.kim.bo.ui.PersonDocumentEmploymentInfo;
039    import org.kuali.rice.kim.bo.ui.PersonDocumentName;
040    import org.kuali.rice.kim.bo.ui.PersonDocumentPhone;
041    import org.kuali.rice.kim.document.IdentityManagementPersonDocument;
042    import org.kuali.rice.kim.document.IdentityManagementRoleDocument;
043    import org.kuali.rice.kim.framework.services.KimFrameworkServiceLocator;
044    import org.kuali.rice.kim.framework.type.KimTypeService;
045    import org.kuali.rice.kim.impl.common.delegate.DelegateTypeBo;
046    import org.kuali.rice.kim.impl.group.GroupBo;
047    import org.kuali.rice.kim.impl.group.GroupMemberBo;
048    import org.kuali.rice.kim.impl.identity.entity.EntityBo;
049    import org.kuali.rice.kim.impl.identity.principal.PrincipalBo;
050    import org.kuali.rice.kim.impl.role.RoleBo;
051    import org.kuali.rice.kim.impl.role.RoleMemberAttributeDataBo;
052    import org.kuali.rice.kim.impl.role.RoleMemberBo;
053    import org.kuali.rice.kim.impl.role.RoleResponsibilityActionBo;
054    import org.kuali.rice.kim.impl.services.KimImplServiceLocator;
055    import org.kuali.rice.kim.util.KimCommonUtilsInternal;
056    import org.kuali.rice.krad.bo.BusinessObject;
057    import org.kuali.rice.krad.bo.PersistableBusinessObject;
058    import org.kuali.rice.krad.document.Document;
059    import org.kuali.rice.krad.util.ObjectUtils;
060    
061    import java.sql.Timestamp;
062    import java.util.ArrayList;
063    import java.util.Collections;
064    import java.util.HashMap;
065    import java.util.List;
066    import java.util.Map;
067    
068    /** 
069     * Customized version of the UiDocumentServiceImpl to support LDAP communcation
070     *
071     * @author Leo Przybylski (przybyls@arizona.edu)
072     */
073    public class LdapUiDocumentServiceImpl extends org.kuali.rice.kim.service.impl.UiDocumentServiceImpl {
074    
075            /**
076             *
077             * @see org.kuali.rice.kim.service.UiDocumentService#loadEntityToPersonDoc(IdentityManagementPersonDocument, String)
078             */
079            public void loadEntityToPersonDoc(IdentityManagementPersonDocument identityManagementPersonDocument, String principalId) {
080                    Principal principal = this.getIdentityService().getPrincipal(principalId);
081            if(principal==null) {
082                    throw new RuntimeException("Principal does not exist for principal id:"+principalId);
083            }
084    
085            identityManagementPersonDocument.setPrincipalId(principal.getPrincipalId());
086            identityManagementPersonDocument.setPrincipalName(principal.getPrincipalName());
087            //identityManagementPersonDocument.setPassword(principal.getPassword());
088            identityManagementPersonDocument.setActive(principal.isActive());
089            Entity kimEntity = this.getIdentityService().getEntity(principal.getEntityId());
090                    identityManagementPersonDocument.setEntityId(kimEntity.getId());
091                    if ( ObjectUtils.isNotNull( kimEntity.getPrivacyPreferences() ) ) {
092                            identityManagementPersonDocument.setPrivacy(loadPrivacyReferences(kimEntity.getPrivacyPreferences()));
093                    }
094                    //identityManagementPersonDocument.setActive(kimEntity.isActive());
095                    identityManagementPersonDocument.setAffiliations(loadAffiliations(kimEntity.getAffiliations(),kimEntity.getEmploymentInformation()));
096                    identityManagementPersonDocument.setNames(loadNames( identityManagementPersonDocument, principalId, kimEntity.getNames(), identityManagementPersonDocument.getPrivacy().isSuppressName() ));
097                    EntityTypeContactInfo entityType = null;
098                    for (EntityTypeContactInfo type : kimEntity.getEntityTypeContactInfos()) {
099                            if (KimConstants.EntityTypes.PERSON.equals(type.getEntityTypeCode())) {
100                                    entityType = EntityTypeContactInfo.Builder.create(type).build();
101                            }
102                    }
103    
104                    if(entityType!=null){
105                            identityManagementPersonDocument.setEmails(loadEmails(identityManagementPersonDocument, principalId, entityType.getEmailAddresses(), identityManagementPersonDocument.getPrivacy().isSuppressEmail()));
106                            identityManagementPersonDocument.setPhones(loadPhones(identityManagementPersonDocument, principalId, entityType.getPhoneNumbers(), identityManagementPersonDocument.getPrivacy().isSuppressPhone()));
107                            identityManagementPersonDocument.setAddrs(loadAddresses(identityManagementPersonDocument, principalId, entityType.getAddresses(), identityManagementPersonDocument.getPrivacy().isSuppressAddress()));
108                    }
109    
110                    List<Group> groups = getGroupService().getGroups(getGroupService().getDirectGroupIdsByPrincipalId(
111                    identityManagementPersonDocument.getPrincipalId()));
112                    loadGroupToPersonDoc(identityManagementPersonDocument, groups);
113                    loadRoleToPersonDoc(identityManagementPersonDocument);
114                    loadDelegationsToPersonDoc(identityManagementPersonDocument);
115            }
116    
117            protected String getInitiatorPrincipalId(Document document){
118                    try{
119                            return document.getDocumentHeader().getWorkflowDocument().getInitiatorPrincipalId();
120                    } catch(Exception ex){
121                            return null;
122                    }
123            }
124    
125            /**
126             * @see org.kuali.rice.kim.service.UiDocumentService#saveEntityPerson(IdentityManagementPersonDocument)
127             */
128        public void saveEntityPerson(IdentityManagementPersonDocument identityManagementPersonDocument) {
129            final Entity kimEntity = getIdentityService().getEntity(identityManagementPersonDocument.getEntityId());
130                    boolean creatingNew = false;
131    
132                    String initiatorPrincipalId = getInitiatorPrincipalId(identityManagementPersonDocument);
133                    boolean inactivatingPrincipal = false;
134    
135                    List <GroupMemberBo>  groupPrincipals = populateGroupMembers(identityManagementPersonDocument);
136                    List <RoleMemberBo>  rolePrincipals = populateRoleMembers(identityManagementPersonDocument);
137                    List <DelegateTypeBo> personDelegations = populateDelegations(identityManagementPersonDocument);
138                    List <PersistableBusinessObject> bos = new ArrayList<PersistableBusinessObject>();
139                    List <RoleResponsibilityActionBo> roleRspActions = populateRoleRspActions(identityManagementPersonDocument);
140                    List <RoleMemberAttributeDataBo> blankRoleMemberAttrs = getBlankRoleMemberAttrs(rolePrincipals);
141                    //if(ObjectUtils.isNotNull(kimEntity.getPrivacyPreferences()))
142                    //      bos.add(kimEntity.getPrivacyPreferences());
143                    bos.addAll(groupPrincipals);
144                    bos.addAll(rolePrincipals);
145                    bos.addAll(roleRspActions);
146                    bos.addAll(personDelegations);
147                    // boservice.save(bos) does not handle deleteawarelist
148                    getBusinessObjectService().save(bos);
149    
150                    if (!blankRoleMemberAttrs.isEmpty()) {
151                            getBusinessObjectService().delete(blankRoleMemberAttrs);
152                    }
153                    if ( inactivatingPrincipal ) {
154                            //when a person is inactivated, inactivate their group, role, and delegation memberships
155                            KimImplServiceLocator.getRoleInternalService().principalInactivated(identityManagementPersonDocument.getPrincipalId());
156                    }
157            }
158    
159        protected boolean setupPrincipal(IdentityManagementPersonDocument identityManagementPersonDocument,EntityBo kimEntity, List<PrincipalBo> origPrincipals) {
160            boolean inactivatingPrincipal = false;
161                    List<PrincipalBo> principals = new ArrayList<PrincipalBo>();
162                    Principal.Builder principal = Principal.Builder.create(identityManagementPersonDocument.getPrincipalName());
163                    principal.setPrincipalId(identityManagementPersonDocument.getPrincipalId());
164                    //principal.setPassword(identityManagementPersonDocument.getPassword());
165                    principal.setActive(identityManagementPersonDocument.isActive());
166                    principal.setEntityId(identityManagementPersonDocument.getEntityId());
167                    if(ObjectUtils.isNotNull(origPrincipals)){
168                            for (PrincipalBo prncpl : origPrincipals) {
169                                    if (prncpl.getPrincipalId()!=null && StringUtils.equals(prncpl.getPrincipalId(), principal.getPrincipalId())) {
170                                            principal.setVersionNumber(prncpl.getVersionNumber());
171                        principal.setObjectId(prncpl.getObjectId());
172                                            // check if inactivating the principal
173                                            if ( prncpl.isActive() && !principal.isActive() ) {
174                                                    inactivatingPrincipal = true;
175                                            }
176                                    }
177                            }
178                    }
179                    principals.add(PrincipalBo.from(principal.build()));
180    
181                    kimEntity.setPrincipals(principals);
182                    return inactivatingPrincipal;
183            }
184    
185            protected List<PersonDocumentAffiliation> loadAffiliations(List <EntityAffiliation> affiliations, List<EntityEmployment> empInfos) {
186                    List<PersonDocumentAffiliation> docAffiliations = new ArrayList<PersonDocumentAffiliation>();
187                    if(ObjectUtils.isNotNull(affiliations)){
188                            for (EntityAffiliation affiliation: affiliations) {
189                                    if(affiliation.isActive()){
190                                            PersonDocumentAffiliation docAffiliation = new PersonDocumentAffiliation();
191                                            docAffiliation.setAffiliationTypeCode(affiliation.getAffiliationType().getCode());
192                                            docAffiliation.setCampusCode(affiliation.getCampusCode());
193                                            docAffiliation.setActive(affiliation.isActive());
194                                            docAffiliation.setDflt(affiliation.isDefaultValue());
195                                            docAffiliation.setEntityAffiliationId(affiliation.getId());
196                                            docAffiliation.refreshReferenceObject("affiliationType");
197                                            // EntityAffiliationImpl does not define empinfos as collection
198                                            docAffiliations.add(docAffiliation);
199                                            docAffiliation.setEdit(true);
200                                            // employment informations
201                                            List<PersonDocumentEmploymentInfo> docEmploymentInformations = new ArrayList<PersonDocumentEmploymentInfo>();
202                                            if(ObjectUtils.isNotNull(empInfos)){
203                                                    for (EntityEmployment empInfo: empInfos) {
204                                                            if (empInfo.isActive()
205                                        && StringUtils.equals(docAffiliation.getEntityAffiliationId(),
206                                                              (empInfo.getEntityAffiliation() != null ? empInfo.getEntityAffiliation().getId() : null))) {
207                                                                    PersonDocumentEmploymentInfo docEmpInfo = new PersonDocumentEmploymentInfo();
208                                                                    docEmpInfo.setEntityEmploymentId(empInfo.getEmployeeId());
209                                                                    docEmpInfo.setEmployeeId(empInfo.getEmployeeId());
210                                                                    docEmpInfo.setEmploymentRecordId(empInfo.getEmploymentRecordId());
211                                                                    docEmpInfo.setBaseSalaryAmount(empInfo.getBaseSalaryAmount());
212                                                                    docEmpInfo.setPrimaryDepartmentCode(empInfo.getPrimaryDepartmentCode());
213                                                                    docEmpInfo.setEmploymentStatusCode(empInfo.getEmployeeStatus() != null ? empInfo.getEmployeeStatus().getCode() : null);
214                                                                    docEmpInfo.setEmploymentTypeCode(empInfo.getEmployeeType() != null ? empInfo.getEmployeeType().getCode() : null);
215                                                                    docEmpInfo.setActive(empInfo.isActive());
216                                                                    docEmpInfo.setPrimary(empInfo.isPrimary());
217                                                                    docEmpInfo.setEntityAffiliationId(empInfo.getEntityAffiliation() != null ? empInfo.getEntityAffiliation().getId() : null);
218                                                                    // there is no version number on KimEntityEmploymentInformationInfo
219                                                                    //docEmpInfo.setVersionNumber(empInfo.getVersionNumber());
220                                                                    docEmpInfo.setEdit(true);
221                                                                    docEmpInfo.refreshReferenceObject("employmentType");
222                                                                    docEmploymentInformations.add(docEmpInfo);
223                                                            }
224                                                    }
225                                            }
226                                            docAffiliation.setEmpInfos(docEmploymentInformations);
227                                    }
228                            }
229                    }
230                    return docAffiliations;
231    
232            }
233    
234        
235        protected List<PersonDocumentName> loadNames( IdentityManagementPersonDocument personDoc, String principalId, List <EntityName> names, boolean suppressDisplay ) {
236                    List<PersonDocumentName> docNames = new ArrayList<PersonDocumentName>();
237                    if(ObjectUtils.isNotNull(names)){
238                            for (EntityName name: names) {
239                                    if(name.isActive()){
240                                            PersonDocumentName docName = new PersonDocumentName();
241                        if (name.getNameType() != null) {
242                                                docName.setNameCode(name.getNameType().getCode());
243                        }
244    
245                                            //We do not need to check the privacy setting here - The UI should care of it
246                                            docName.setFirstName(name.getFirstNameUnmasked());
247                                            docName.setLastName(name.getLastNameUnmasked());
248                                            docName.setMiddleName(name.getMiddleNameUnmasked());
249                                            docName.setNamePrefix(name.getNamePrefixUnmasked());
250                                            docName.setNameSuffix(name.getNameSuffixUnmasked());
251    
252                                            docName.setActive(name.isActive());
253                                            docName.setDflt(name.isDefaultValue());
254                                            docName.setEdit(true);
255                                            docName.setEntityNameId(name.getId());
256                                            docNames.add(docName);
257                                    }
258                            }
259                    }
260                    return docNames;
261            }
262    
263        protected List<PersonDocumentAddress> loadAddresses(IdentityManagementPersonDocument identityManagementPersonDocument, String principalId, List<EntityAddress> entityAddresses, boolean suppressDisplay ) {
264                    List<PersonDocumentAddress> docAddresses = new ArrayList<PersonDocumentAddress>();
265                    if(ObjectUtils.isNotNull(entityAddresses)){
266                            for (EntityAddress address: entityAddresses) {
267                                    if(address.isActive()){
268                                            PersonDocumentAddress docAddress = new PersonDocumentAddress();
269                                            docAddress.setEntityTypeCode(address.getEntityTypeCode());
270                                            docAddress.setAddressTypeCode(address.getAddressType().getCode());
271    
272                                            //We do not need to check the privacy setting here - The UI should care of it
273                                            docAddress.setLine1(address.getLine1Unmasked());
274                                            docAddress.setLine2(address.getLine2Unmasked());
275                                            docAddress.setLine3(address.getLine3Unmasked());
276                                            docAddress.setStateProvinceCode(address.getStateProvinceCodeUnmasked());
277                                            docAddress.setPostalCode(address.getPostalCodeUnmasked());
278                                            docAddress.setCountryCode(address.getCountryCodeUnmasked());
279                                            docAddress.setCity(address.getCityUnmasked());
280    
281                                            docAddress.setActive(address.isActive());
282                                            docAddress.setDflt(address.isDefaultValue());
283                                            docAddress.setEntityAddressId(address.getId());
284                                            docAddress.setEdit(true);
285                                            docAddresses.add(docAddress);
286                                    }
287                            }
288                    }
289                    return docAddresses;
290            }
291    
292        protected List<PersonDocumentEmail> loadEmails(IdentityManagementPersonDocument identityManagementPersonDocument, String principalId, List<EntityEmail> entityEmails, boolean suppressDisplay ) {
293                    List<PersonDocumentEmail> emails = new ArrayList<PersonDocumentEmail>();
294                    if(ObjectUtils.isNotNull(entityEmails)){
295                            for (EntityEmail email: entityEmails) {
296                                    if(email.isActive()){
297                                            PersonDocumentEmail docEmail = new PersonDocumentEmail();
298                                            //docEmail.setEntityId(email.getEntityId());
299                                            docEmail.setEntityTypeCode(email.getEntityTypeCode());
300                        if (email.getEmailType() != null) {
301                                                docEmail.setEmailTypeCode(email.getEmailType().getCode());
302                        }
303                                            // EmailType not on info object.
304                                            //docEmail.setEmailType(((KimEntityEmailImpl)email).getEmailType());
305                                            //We do not need to check the privacy setting here - The UI should care of it
306                                            docEmail.setEmailAddress(email.getEmailAddressUnmasked());
307    
308                                            docEmail.setActive(email.isActive());
309                                            docEmail.setDflt(email.isDefaultValue());
310                                            docEmail.setEntityEmailId(email.getId());
311                                            docEmail.setEdit(true);
312                                            emails.add(docEmail);
313                                    }
314                            }
315                    }
316                    return emails;
317            }
318    
319        protected List<PersonDocumentPhone> loadPhones(IdentityManagementPersonDocument identityManagementPersonDocument, String principalId, List<EntityPhone> entityPhones, boolean suppressDisplay ) {
320                    List<PersonDocumentPhone> docPhones = new ArrayList<PersonDocumentPhone>();
321                    if(ObjectUtils.isNotNull(entityPhones)){
322                            for (EntityPhone phone: entityPhones) {
323                                    if(phone.isActive()){
324                                            PersonDocumentPhone docPhone = new PersonDocumentPhone();
325                        if (phone.getPhoneType() != null) {
326                                                docPhone.setPhoneTypeCode(phone.getPhoneType().getCode());
327                        }
328                                            //docPhone.setPhoneType(((KimEntityPhoneImpl)phone).getPhoneType());
329                                            docPhone.setEntityTypeCode(phone.getEntityTypeCode());
330                                            //We do not need to check the privacy setting here - The UI should care of it
331                                            docPhone.setPhoneNumber(phone.getPhoneNumberUnmasked());
332                                            docPhone.setCountryCode(phone.getCountryCodeUnmasked());
333                                            docPhone.setExtensionNumber(phone.getExtensionNumberUnmasked());
334    
335                                            docPhone.setActive(phone.isActive());
336                                            docPhone.setDflt(phone.isDefaultValue());
337                                            docPhone.setEntityPhoneId(phone.getId());
338                                            docPhone.setEdit(true);
339                                            docPhones.add(docPhone);
340                                    }
341                            }
342                    }
343                    return docPhones;
344    
345            }
346    
347        public BusinessObject getMember(String memberTypeCode, String memberId){
348            Class<? extends BusinessObject> roleMemberTypeClass = null;
349            String roleMemberIdName = "";
350            if(MemberType.PRINCIPAL.getCode().equals(memberTypeCode)){
351                    roleMemberTypeClass = PrincipalBo.class;
352                    roleMemberIdName = KimConstants.PrimaryKeyConstants.PRINCIPAL_ID;
353                            Principal principalInfo = getIdentityService().getPrincipal(memberId);
354                            if (principalInfo != null) {
355                                    
356                            }
357            } else if(MemberType.GROUP.getCode().equals(memberTypeCode)){
358                    roleMemberTypeClass = GroupBo.class;
359                    roleMemberIdName = KimConstants.PrimaryKeyConstants.GROUP_ID;
360                    Group groupInfo = null;
361                            groupInfo = getGroupService().getGroup(memberId);
362                            if (groupInfo != null) {
363                                    
364                            }
365            } else if(MemberType.ROLE.getCode().equals(memberTypeCode)){
366                    roleMemberTypeClass = RoleBo.class;
367                    roleMemberIdName = KimConstants.PrimaryKeyConstants.ROLE_ID;
368                            Role role = getRoleService().getRole(memberId);
369                            if (role != null) {
370                                    
371                            }
372            }
373            Map<String, String> criteria = new HashMap<String, String>();
374            criteria.put(roleMemberIdName, memberId);
375            return getBusinessObjectService().findByPrimaryKey(roleMemberTypeClass, criteria);
376        }
377    
378        /**
379         * Overridden to only check permission - users should not be able to edit themselves.
380         * 
381         * @see org.kuali.rice.kim.service.impl.UiDocumentServiceImpl#canModifyEntity(java.lang.String, java.lang.String)
382         */
383        @Override
384            public boolean canModifyEntity( String currentUserPrincipalId, String toModifyPrincipalId ){
385                    return (StringUtils.isNotBlank(currentUserPrincipalId) && StringUtils.isNotBlank(toModifyPrincipalId) &&
386                                    currentUserPrincipalId.equals(toModifyPrincipalId)) ||
387                                    getPermissionService().isAuthorized(
388                                                    currentUserPrincipalId,
389                                                    KimConstants.NAMESPACE_CODE,
390                                                    KimConstants.PermissionNames.MODIFY_ENTITY,
391                                                    Collections.singletonMap(KimConstants.AttributeConstants.PRINCIPAL_ID, currentUserPrincipalId));
392            }
393        
394        protected List<RoleMemberBo> getRoleMembers(IdentityManagementRoleDocument identityManagementRoleDocument, List<RoleMemberBo> origRoleMembers){
395            List<RoleMemberBo> roleMembers = new ArrayList<RoleMemberBo>();
396            RoleMemberBo newRoleMember;
397            RoleMemberBo origRoleMemberImplTemp;
398            List<RoleMemberAttributeDataBo> origAttributes;
399            boolean activatingInactive = false;
400            String newRoleMemberIdAssigned = "";
401    
402            identityManagementRoleDocument.setKimType(KimApiServiceLocator.getKimTypeInfoService().getKimType(identityManagementRoleDocument.getRoleTypeId()));
403            KimTypeService kimTypeService = KimFrameworkServiceLocator.getKimTypeService(identityManagementRoleDocument.getKimType());
404    
405            if(CollectionUtils.isNotEmpty(identityManagementRoleDocument.getMembers())){
406                for(KimDocumentRoleMember documentRoleMember: identityManagementRoleDocument.getMembers()){
407                    origRoleMemberImplTemp = null;
408    
409                    newRoleMember = new RoleMemberBo();
410                    KimCommonUtilsInternal.copyProperties(newRoleMember, documentRoleMember);
411                    newRoleMember.setRoleId(identityManagementRoleDocument.getRoleId());
412                    if(ObjectUtils.isNotNull(origRoleMembers)){
413                        for(RoleMemberBo origRoleMemberImpl: origRoleMembers){
414                            if((origRoleMemberImpl.getRoleId()!=null && StringUtils.equals(origRoleMemberImpl.getRoleId(), newRoleMember.getRoleId())) &&
415                                (origRoleMemberImpl.getMemberId()!=null && StringUtils.equals(origRoleMemberImpl.getMemberId(), newRoleMember.getMemberId())) &&
416                                (origRoleMemberImpl.getType()!=null && org.apache.commons.lang.ObjectUtils.equals(origRoleMemberImpl.getType(), newRoleMember.getType())) &&
417                                !origRoleMemberImpl.isActive(new Timestamp(System.currentTimeMillis())) &&
418                                !kimTypeService.validateUniqueAttributes(identityManagementRoleDocument.getKimType().getId(),
419                                        documentRoleMember.getQualifierAsMap(), origRoleMemberImpl.getAttributes()).isEmpty()) {
420    
421                                //TODO: verify if you want to add  && newRoleMember.isActive() condition to if...
422    
423                                newRoleMemberIdAssigned = newRoleMember.getId();
424                                newRoleMember.setId(origRoleMemberImpl.getId());
425                                activatingInactive = true;
426                            }
427                            if(origRoleMemberImpl.getId()!=null && StringUtils.equals(origRoleMemberImpl.getId(), newRoleMember.getId())){
428                                newRoleMember.setVersionNumber(origRoleMemberImpl.getVersionNumber());
429                                origRoleMemberImplTemp = origRoleMemberImpl;
430                            }
431                        }
432                    }
433                    origAttributes = (origRoleMemberImplTemp==null || origRoleMemberImplTemp.getAttributes()==null)?
434                                        new ArrayList<RoleMemberAttributeDataBo>():origRoleMemberImplTemp.getAttributeDetails();
435                    newRoleMember.setActiveFromDateValue(documentRoleMember.getActiveFromDate());
436                    newRoleMember.setActiveToDateValue(documentRoleMember.getActiveToDate());
437                    newRoleMember.setAttributeDetails(getRoleMemberAttributeData(documentRoleMember.getQualifiers(), origAttributes, activatingInactive, newRoleMemberIdAssigned));
438                    newRoleMember.setRoleRspActions(getRoleMemberResponsibilityActions(documentRoleMember, origRoleMemberImplTemp, activatingInactive, newRoleMemberIdAssigned));
439                    roleMembers.add(newRoleMember);
440                    activatingInactive = false;
441                }
442            }
443            return roleMembers;
444        }
445    }