001 /**
002 * Copyright 2005-2014 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.apache.log4j.Logger;
021 import org.joda.time.DateTime;
022 import org.kuali.rice.core.api.config.property.ConfigContext;
023 import org.kuali.rice.core.api.criteria.Predicate;
024 import org.kuali.rice.core.api.criteria.PredicateUtils;
025 import org.kuali.rice.core.api.criteria.QueryByCriteria;
026 import org.kuali.rice.core.api.membership.MemberType;
027 import org.kuali.rice.core.api.resourceloader.GlobalResourceLoader;
028 import org.kuali.rice.coreservice.api.parameter.Parameter;
029 import org.kuali.rice.core.api.uif.RemotableCheckbox;
030 import org.kuali.rice.core.api.uif.RemotableCheckboxGroup;
031 import org.kuali.rice.coreservice.framework.parameter.ParameterService;
032 import org.kuali.rice.coreservice.framework.CoreFrameworkServiceLocator;
033 import org.kuali.rice.kim.api.KimConstants;
034 import org.kuali.rice.kim.api.KimConstants.KimGroupMemberTypes;
035 import org.kuali.rice.kim.api.group.Group;
036 import org.kuali.rice.kim.api.group.GroupMember;
037 import org.kuali.rice.kim.api.group.GroupService;
038 import org.kuali.rice.kim.api.identity.IdentityService;
039 import org.kuali.rice.kim.api.identity.Person;
040 import org.kuali.rice.kim.api.identity.address.EntityAddress;
041 import org.kuali.rice.kim.api.identity.address.EntityAddressContract;
042 import org.kuali.rice.kim.api.identity.affiliation.EntityAffiliation;
043 import org.kuali.rice.kim.api.identity.email.EntityEmail;
044 import org.kuali.rice.kim.api.identity.email.EntityEmailContract;
045 import org.kuali.rice.kim.api.identity.employment.EntityEmployment;
046 import org.kuali.rice.kim.api.identity.entity.Entity;
047 import org.kuali.rice.kim.api.identity.entity.EntityDefault;
048 import org.kuali.rice.kim.api.identity.name.EntityName;
049 import org.kuali.rice.kim.api.identity.phone.EntityPhone;
050 import org.kuali.rice.kim.api.identity.phone.EntityPhoneContract;
051 import org.kuali.rice.kim.api.identity.principal.Principal;
052 import org.kuali.rice.kim.api.identity.privacy.EntityPrivacyPreferences;
053 import org.kuali.rice.kim.api.identity.type.EntityTypeContactInfo;
054 import org.kuali.rice.kim.api.permission.PermissionService;
055 import org.kuali.rice.kim.api.responsibility.ResponsibilityService;
056 import org.kuali.rice.kim.api.role.Role;
057 import org.kuali.rice.kim.api.role.RoleMember;
058 import org.kuali.rice.kim.api.role.RoleService;
059 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
060 import org.kuali.rice.kim.api.type.KimAttributeField;
061 import org.kuali.rice.kim.api.type.KimType;
062 import org.kuali.rice.kim.api.type.KimTypeAttribute;
063 import org.kuali.rice.kim.api.type.KimTypeInfoService;
064 import org.kuali.rice.kim.bo.ui.GroupDocumentMember;
065 import org.kuali.rice.kim.bo.ui.GroupDocumentQualifier;
066 import org.kuali.rice.kim.bo.ui.KimDocumentRoleMember;
067 import org.kuali.rice.kim.bo.ui.KimDocumentRolePermission;
068 import org.kuali.rice.kim.bo.ui.KimDocumentRoleQualifier;
069 import org.kuali.rice.kim.bo.ui.KimDocumentRoleResponsibility;
070 import org.kuali.rice.kim.bo.ui.KimDocumentRoleResponsibilityAction;
071 import org.kuali.rice.kim.bo.ui.PersonDocumentAddress;
072 import org.kuali.rice.kim.bo.ui.PersonDocumentAffiliation;
073 import org.kuali.rice.kim.bo.ui.PersonDocumentEmail;
074 import org.kuali.rice.kim.bo.ui.PersonDocumentEmploymentInfo;
075 import org.kuali.rice.kim.bo.ui.PersonDocumentGroup;
076 import org.kuali.rice.kim.bo.ui.PersonDocumentName;
077 import org.kuali.rice.kim.bo.ui.PersonDocumentPhone;
078 import org.kuali.rice.kim.bo.ui.PersonDocumentPrivacy;
079 import org.kuali.rice.kim.bo.ui.PersonDocumentRole;
080 import org.kuali.rice.kim.bo.ui.RoleDocumentDelegation;
081 import org.kuali.rice.kim.bo.ui.RoleDocumentDelegationMember;
082 import org.kuali.rice.kim.bo.ui.RoleDocumentDelegationMemberQualifier;
083 import org.kuali.rice.kim.document.IdentityManagementGroupDocument;
084 import org.kuali.rice.kim.document.IdentityManagementPersonDocument;
085 import org.kuali.rice.kim.document.IdentityManagementRoleDocument;
086 import org.kuali.rice.kim.framework.services.KimFrameworkServiceLocator;
087 import org.kuali.rice.kim.framework.type.KimTypeService;
088 import org.kuali.rice.kim.impl.KIMPropertyConstants;
089 import org.kuali.rice.kim.impl.common.attribute.KimAttributeDataBo;
090 import org.kuali.rice.kim.impl.common.delegate.DelegateTypeBo;
091 import org.kuali.rice.kim.impl.common.delegate.DelegateMemberAttributeDataBo;
092 import org.kuali.rice.kim.impl.common.delegate.DelegateMemberBo;
093 import org.kuali.rice.kim.impl.group.GroupAttributeBo;
094 import org.kuali.rice.kim.impl.group.GroupBo;
095 import org.kuali.rice.kim.impl.group.GroupMemberBo;
096 import org.kuali.rice.kim.impl.identity.IdentityArchiveService;
097 import org.kuali.rice.kim.impl.identity.address.EntityAddressBo;
098 import org.kuali.rice.kim.impl.identity.address.EntityAddressTypeBo;
099 import org.kuali.rice.kim.impl.identity.affiliation.EntityAffiliationBo;
100 import org.kuali.rice.kim.impl.identity.affiliation.EntityAffiliationTypeBo;
101 import org.kuali.rice.kim.impl.identity.email.EntityEmailBo;
102 import org.kuali.rice.kim.impl.identity.email.EntityEmailTypeBo;
103 import org.kuali.rice.kim.impl.identity.employment.EntityEmploymentBo;
104 import org.kuali.rice.kim.impl.identity.employment.EntityEmploymentStatusBo;
105 import org.kuali.rice.kim.impl.identity.employment.EntityEmploymentTypeBo;
106 import org.kuali.rice.kim.impl.identity.entity.EntityBo;
107 import org.kuali.rice.kim.impl.identity.name.EntityNameBo;
108 import org.kuali.rice.kim.impl.identity.name.EntityNameTypeBo;
109 import org.kuali.rice.kim.impl.identity.phone.EntityPhoneBo;
110 import org.kuali.rice.kim.impl.identity.phone.EntityPhoneTypeBo;
111 import org.kuali.rice.kim.impl.identity.principal.PrincipalBo;
112 import org.kuali.rice.kim.impl.identity.privacy.EntityPrivacyPreferencesBo;
113 import org.kuali.rice.kim.impl.identity.type.EntityTypeContactInfoBo;
114 import org.kuali.rice.kim.impl.permission.PermissionBo;
115 import org.kuali.rice.kim.impl.responsibility.ResponsibilityInternalService;
116 import org.kuali.rice.kim.impl.role.RoleBo;
117 import org.kuali.rice.kim.impl.role.RoleBoLite;
118 import org.kuali.rice.kim.impl.role.RoleMemberAttributeDataBo;
119 import org.kuali.rice.kim.impl.role.RoleMemberBo;
120 import org.kuali.rice.kim.impl.role.RolePermissionBo;
121 import org.kuali.rice.kim.impl.role.RoleResponsibilityActionBo;
122 import org.kuali.rice.kim.impl.role.RoleResponsibilityBo;
123 import org.kuali.rice.kim.impl.services.KimImplServiceLocator;
124 import org.kuali.rice.kim.impl.type.KimTypeBo;
125 import org.kuali.rice.kim.service.KIMServiceLocatorInternal;
126 import org.kuali.rice.kim.service.UiDocumentService;
127 import org.kuali.rice.kim.service.dao.UiDocumentServiceDAO;
128 import org.kuali.rice.kim.util.KimCommonUtilsInternal;
129 import org.kuali.rice.kns.datadictionary.exporter.AttributesMapBuilder;
130 import org.kuali.rice.kns.kim.type.DataDictionaryTypeServiceHelper;
131 import org.kuali.rice.kns.service.DocumentHelperService;
132 import org.kuali.rice.kns.service.KNSServiceLocator;
133 import org.kuali.rice.krad.bo.BusinessObject;
134 import org.kuali.rice.krad.bo.PersistableBusinessObject;
135 import org.kuali.rice.krad.datadictionary.AttributeDefinition;
136 import org.kuali.rice.krad.datadictionary.exporter.ExportMap;
137 import org.kuali.rice.krad.document.Document;
138 import org.kuali.rice.krad.service.BusinessObjectService;
139 import org.kuali.rice.krad.service.KRADServiceLocator;
140 import org.kuali.rice.krad.util.KRADConstants;
141 import org.kuali.rice.krad.util.ObjectUtils;
142
143 import java.sql.Timestamp;
144 import java.util.ArrayList;
145 import java.util.Collection;
146 import java.util.Collections;
147 import java.util.Comparator;
148 import java.util.HashMap;
149 import java.util.HashSet;
150 import java.util.List;
151 import java.util.Map;
152 import java.util.Set;
153
154 import javax.xml.namespace.QName;
155
156 /**
157 * This is a description of what this class does - shyu don't forget to fill this in.
158 *
159 * @author Kuali Rice Team (rice.collab@kuali.org)
160 *
161 */
162 public class UiDocumentServiceImpl implements UiDocumentService {
163 private static final Logger LOG = Logger.getLogger(UiDocumentServiceImpl.class);
164 private static final String SHOW_BLANK_QUALIFIERS = "kim.show.blank.qualifiers";
165 private static final String KIM_IDENTITY_ARCHIVE_SERVICE = "kimIdentityArchiveService";
166
167 private IdentityArchiveService identityArchiveService;
168 private RoleService roleService;
169 private BusinessObjectService businessObjectService;
170 private IdentityService identityService;
171 private PermissionService permissionService;
172 private GroupService groupService;
173 private ResponsibilityService responsibilityService;
174 private ResponsibilityInternalService responsibilityInternalService;
175 private KimTypeInfoService kimTypeInfoService;
176 private DocumentHelperService documentHelperService;
177 private ParameterService parameterService;
178 private UiDocumentServiceDAO uiDocumentServiceDAO;
179
180 /**
181 * @see org.kuali.rice.kim.service.UiDocumentService#saveEntityPerson(IdentityManagementPersonDocument)
182 */
183 public void saveEntityPerson(
184 IdentityManagementPersonDocument identityManagementPersonDocument) {
185 EntityBo kimEntity = new EntityBo();
186 EntityBo origEntity = getEntityBo(identityManagementPersonDocument.getEntityId());
187 boolean creatingNew = true;
188 if (origEntity == null) {
189 origEntity = new EntityBo();
190 kimEntity.setActive(true);
191 } else {
192 // TODO : in order to resolve optimistic locking issue. has to get identity and set the version number if identity records matched
193 // Need to look into this.
194 //kimEntity = origEntity;
195 kimEntity.setActive(origEntity.isActive());
196 kimEntity.setVersionNumber(origEntity.getVersionNumber());
197 creatingNew = false;
198 }
199
200 kimEntity.setId(identityManagementPersonDocument.getEntityId());
201 String initiatorPrincipalId = getInitiatorPrincipalId(identityManagementPersonDocument);
202 boolean inactivatingPrincipal = false;
203 if(canModifyEntity(initiatorPrincipalId, identityManagementPersonDocument.getPrincipalId())){
204 inactivatingPrincipal = setupPrincipal(identityManagementPersonDocument, kimEntity, origEntity.getPrincipals());
205 setupAffiliation(identityManagementPersonDocument, kimEntity, origEntity.getAffiliations(), origEntity.getEmploymentInformation());
206 setupName(identityManagementPersonDocument, kimEntity, origEntity.getNames());
207 // entitytype
208 List<EntityTypeContactInfoBo> entityTypes = new ArrayList<EntityTypeContactInfoBo>();
209 EntityTypeContactInfoBo entityType = new EntityTypeContactInfoBo();
210 entityType.setEntityId(identityManagementPersonDocument.getEntityId());
211 entityType.setEntityTypeCode(KimConstants.EntityTypes.PERSON);
212 entityType.setActive(true);
213 entityTypes.add(entityType);
214 EntityTypeContactInfoBo origEntityType = new EntityTypeContactInfoBo();
215 for (EntityTypeContactInfoBo type : origEntity.getEntityTypeContactInfos()) {
216 // should check identity.entitytypeid, but it's not persist in persondoc yet
217 if (type.getEntityTypeCode()!=null && StringUtils.equals(type.getEntityTypeCode(), entityType.getEntityTypeCode())) {
218 origEntityType = type;
219 entityType.setVersionNumber(type.getVersionNumber());
220 entityType.setActive(type.isActive());
221 }
222 }
223 setupPhone(identityManagementPersonDocument, entityType, origEntityType.getPhoneNumbers());
224 setupEmail(identityManagementPersonDocument, entityType, origEntityType.getEmailAddresses());
225 setupAddress(identityManagementPersonDocument, entityType, origEntityType.getAddresses());
226 kimEntity.setEntityTypeContactInfos(entityTypes);
227 } else{
228 if(ObjectUtils.isNotNull(origEntity.getExternalIdentifiers())) {
229 kimEntity.setExternalIdentifiers(origEntity.getExternalIdentifiers());
230 }
231 if(ObjectUtils.isNotNull(origEntity.getEmploymentInformation())) {
232 kimEntity.setEmploymentInformation(origEntity.getEmploymentInformation());
233 }
234 if(ObjectUtils.isNotNull(origEntity.getAffiliations())) {
235 kimEntity.setAffiliations(origEntity.getAffiliations());
236 }
237 if(ObjectUtils.isNotNull(origEntity.getNames())) {
238 kimEntity.setNames(origEntity.getNames());
239 }
240 if(ObjectUtils.isNotNull(origEntity.getEntityTypeContactInfos())) {
241 kimEntity.setEntityTypeContactInfos(origEntity.getEntityTypeContactInfos());
242 }
243 }
244 if(creatingNew || canOverrideEntityPrivacyPreferences(getInitiatorPrincipalId(identityManagementPersonDocument), identityManagementPersonDocument.getPrincipalId())) {
245 setupPrivacy(identityManagementPersonDocument, kimEntity, origEntity.getPrivacyPreferences());
246 } else {
247 if(ObjectUtils.isNotNull(origEntity.getPrivacyPreferences())) {
248 kimEntity.setPrivacyPreferences(origEntity.getPrivacyPreferences());
249 }
250 }
251 List <GroupMemberBo> groupPrincipals = populateGroupMembers(identityManagementPersonDocument);
252 List <RoleMemberBo> rolePrincipals = populateRoleMembers(identityManagementPersonDocument);
253 List <DelegateTypeBo> personDelegations = populateDelegations(identityManagementPersonDocument);
254 List <PersistableBusinessObject> bos = new ArrayList<PersistableBusinessObject>();
255 List <RoleResponsibilityActionBo> roleRspActions = populateRoleRspActions(identityManagementPersonDocument);
256 List <RoleMemberAttributeDataBo> blankRoleMemberAttrs = getBlankRoleMemberAttrs(rolePrincipals);
257 bos.add(kimEntity);
258 //if(ObjectUtils.isNotNull(kimEntity.getPrivacyPreferences()))
259 // bos.add(kimEntity.getPrivacyPreferences());
260 bos.addAll(groupPrincipals);
261 bos.addAll(rolePrincipals);
262 bos.addAll(roleRspActions);
263 bos.addAll(personDelegations);
264 // boservice.save(bos) does not handle deleteawarelist
265 getBusinessObjectService().save(bos);
266
267 if (!blankRoleMemberAttrs.isEmpty()) {
268 getBusinessObjectService().delete(blankRoleMemberAttrs);
269 }
270 if ( inactivatingPrincipal ) {
271 //when a person is inactivated, inactivate their group, role, and delegation memberships
272 KimImplServiceLocator.getRoleInternalService().principalInactivated(
273 identityManagementPersonDocument.getPrincipalId());
274 }
275 }
276
277 private String getInitiatorPrincipalId(Document document){
278 try{
279 return document.getDocumentHeader().getWorkflowDocument().getInitiatorPrincipalId();
280 } catch(Exception ex){
281 return null;
282 }
283 }
284
285 public Map<String,Object> getAttributeEntries( List<KimAttributeField> definitions ) {
286 final Map<String,Object> attributeEntries = new HashMap<String,Object>();
287 if (definitions != null) {
288 for (AttributeDefinition definition : DataDictionaryTypeServiceHelper.toKimAttributeDefinitions(definitions)) {
289 final AttributesMapBuilder builder = new AttributesMapBuilder();
290 final ExportMap map = builder.buildAttributeMap(definition, "");
291 attributeEntries.put(definition.getName(),map.getExportData());
292 }
293 }
294 return attributeEntries;
295 }
296
297
298 /**
299 *
300 * @see org.kuali.rice.kim.service.UiDocumentService#loadEntityToPersonDoc(IdentityManagementPersonDocument, String)
301 */
302 public void loadEntityToPersonDoc(IdentityManagementPersonDocument identityManagementPersonDocument, String principalId) {
303 Principal principal = this.getIdentityService().getPrincipal(principalId);
304 Entity kimEntity = null;
305
306 if(ObjectUtils.isNotNull(principal)) {
307 // If the principal is not null it was found in the identity management service
308 kimEntity = this.getIdentityService().getEntity(principal.getEntityId());
309 }
310
311 if(ObjectUtils.isNull(principal) || ObjectUtils.isNull(kimEntity)) {
312 // If the principal or entity is null look up the entity in the
313 // archive service, and then get the principal from it
314 IdentityArchiveService identityArchive = getIdentityArchiveService();
315 EntityDefault entityInfo = identityArchive.getEntityDefaultFromArchiveByPrincipalId(principalId);
316 principal = entityInfo.getPrincipals().get(0);
317 Entity.Builder eb = Entity.Builder.create();
318 eb.setId(entityInfo.getEntityId());
319 kimEntity = eb.build();
320
321 }
322 if(kimEntity == null) {
323 throw new RuntimeException("Entity does not exist for principal id: " + principalId);
324 }
325 if(principal==null) {
326 throw new RuntimeException("Principal does not exist for principal id:"+principalId);
327 }
328
329 identityManagementPersonDocument.setPrincipalId(principal.getPrincipalId());
330 identityManagementPersonDocument.setPrincipalName(principal.getPrincipalName());
331 //identityManagementPersonDocument.setPassword(principal.getPassword());
332 identityManagementPersonDocument.setActive(principal.isActive());
333 identityManagementPersonDocument.setEntityId(kimEntity.getId());
334 if ( ObjectUtils.isNotNull( kimEntity.getPrivacyPreferences() ) ) {
335 identityManagementPersonDocument.setPrivacy(loadPrivacyReferences(kimEntity.getPrivacyPreferences()));
336 }
337 //identityManagementPersonDocument.setActive(kimEntity.isActive());
338 identityManagementPersonDocument.setAffiliations(loadAffiliations(kimEntity.getAffiliations(),kimEntity.getEmploymentInformation()));
339 identityManagementPersonDocument.setNames(loadNames( identityManagementPersonDocument, principalId, kimEntity.getNames(), identityManagementPersonDocument.getPrivacy().isSuppressName() ));
340 EntityTypeContactInfo entityType = null;
341 for (EntityTypeContactInfo type : kimEntity.getEntityTypeContactInfos()) {
342 if (KimConstants.EntityTypes.PERSON.equals(type.getEntityTypeCode())) {
343 entityType = EntityTypeContactInfo.Builder.create(type).build();
344 }
345 }
346
347 if(entityType!=null){
348 identityManagementPersonDocument.setEmails(loadEmails(identityManagementPersonDocument, principalId, entityType.getEmailAddresses(), identityManagementPersonDocument.getPrivacy().isSuppressEmail()));
349 identityManagementPersonDocument.setPhones(loadPhones(identityManagementPersonDocument, principalId, entityType.getPhoneNumbers(), identityManagementPersonDocument.getPrivacy().isSuppressPhone()));
350 identityManagementPersonDocument.setAddrs(loadAddresses(identityManagementPersonDocument, principalId, entityType.getAddresses(), identityManagementPersonDocument.getPrivacy().isSuppressAddress()));
351 }
352
353 List<Group> groups = getGroupService().getGroups(getGroupService().getDirectGroupIdsByPrincipalId(
354 identityManagementPersonDocument.getPrincipalId()));
355 loadGroupToPersonDoc(identityManagementPersonDocument, groups);
356 loadRoleToPersonDoc(identityManagementPersonDocument);
357 loadDelegationsToPersonDoc(identityManagementPersonDocument);
358 }
359
360 @SuppressWarnings("unchecked")
361 public List<DelegateTypeBo> getPersonDelegations(String principalId){
362 if(principalId==null) {
363 return new ArrayList<DelegateTypeBo>();
364 }
365 Map<String,String> criteria = new HashMap<String,String>(1);
366 criteria.put(KimConstants.PrimaryKeyConstants.MEMBER_ID, principalId);
367 criteria.put( KIMPropertyConstants.DelegationMember.MEMBER_TYPE_CODE, MemberType.PRINCIPAL.getCode() );
368 List<DelegateMemberBo> delegationMembers = (List<DelegateMemberBo>)getBusinessObjectService().findMatching(DelegateMemberBo.class, criteria);
369 List<DelegateTypeBo> delegations = new ArrayList<DelegateTypeBo>();
370 List<String> delegationIds = new ArrayList<String>();
371 if(ObjectUtils.isNotNull(delegationMembers)){
372 for(DelegateMemberBo delegationMember: delegationMembers){
373 if(!delegationIds.contains(delegationMember.getDelegationId())){
374 delegationIds.add(delegationMember.getDelegationId());
375 criteria = new HashMap<String,String>(1);
376 criteria.put(KimConstants.PrimaryKeyConstants.DELEGATION_ID, delegationMember.getDelegationId());
377 delegations.add(getBusinessObjectService().findByPrimaryKey(DelegateTypeBo.class, criteria));
378 }
379 }
380 }
381 return delegations;
382 }
383
384
385 protected void loadDelegationsToPersonDoc(IdentityManagementPersonDocument identityManagementPersonDocument){
386 List<RoleDocumentDelegation> delList = new ArrayList<RoleDocumentDelegation>();
387 RoleDocumentDelegation documentDelegation;
388 List<DelegateTypeBo> origDelegations = getPersonDelegations(identityManagementPersonDocument.getPrincipalId());
389 if(ObjectUtils.isNotNull(origDelegations)){
390 for(DelegateTypeBo del: origDelegations){
391 if(del.isActive()){
392 documentDelegation = new RoleDocumentDelegation();
393 documentDelegation.setActive(del.isActive());
394 documentDelegation.setDelegationId(del.getDelegationId());
395 documentDelegation.setDelegationTypeCode(del.getDelegationTypeCode());
396 documentDelegation.setKimTypeId(del.getKimTypeId());
397 documentDelegation.setMembers(
398 loadDelegationMembers(identityManagementPersonDocument,
399 del.getMembers(), (RoleBo)getMember(MemberType.ROLE, del.getRoleId())));
400 documentDelegation.setRoleId(del.getRoleId());
401 documentDelegation.setEdit(true);
402 delList.add(documentDelegation);
403 }
404 }
405 }
406 identityManagementPersonDocument.setDelegations(delList);
407 setDelegationMembersInDocument(identityManagementPersonDocument);
408 }
409
410 public void setDelegationMembersInDocument(IdentityManagementPersonDocument identityManagementPersonDocument){
411 if(CollectionUtils.isNotEmpty(identityManagementPersonDocument.getDelegations())){
412 for(RoleDocumentDelegation delegation: identityManagementPersonDocument.getDelegations()){
413 if(CollectionUtils.isNotEmpty(delegation.getMembers())){
414 for(RoleDocumentDelegationMember member: delegation.getMembers()){
415 if (StringUtils.equals(member.getMemberId(), identityManagementPersonDocument.getPrincipalId()))
416 {
417 member.setDelegationTypeCode(delegation.getDelegationTypeCode());
418 identityManagementPersonDocument.getDelegationMembers().add(member);
419 }
420 }
421 }
422 }
423 }
424 }
425
426 protected List<RoleDocumentDelegationMember> loadDelegationMembers(
427 IdentityManagementPersonDocument identityManagementPersonDocument, List<DelegateMemberBo> members, RoleBo roleImpl){
428 List<RoleDocumentDelegationMember> pndMembers = new ArrayList<RoleDocumentDelegationMember>();
429 RoleDocumentDelegationMember pndMember;
430 RoleMemberBo roleMember;
431 if(ObjectUtils.isNotNull(members)){
432 for(DelegateMemberBo member: members){
433 pndMember = new RoleDocumentDelegationMember();
434 pndMember.setActiveFromDate(member.getActiveFromDateValue());
435 pndMember.setActiveToDate(member.getActiveToDateValue());
436 pndMember.setActive(member.isActive(new Timestamp(System.currentTimeMillis())));
437 pndMember.setRoleBo(roleImpl);
438 if(pndMember.isActive()){
439 pndMember.setMemberId(member.getMemberId());
440 pndMember.setDelegationMemberId(member.getDelegationMemberId());
441 pndMember.setMemberTypeCode(member.getType().getCode());
442 pndMember.setDelegationId(member.getDelegationId());
443 pndMember.setVersionNumber(member.getVersionNumber());
444 pndMember.setObjectId(member.getObjectId());
445
446 pndMember.setRoleMemberId(member.getRoleMemberId());
447 roleMember = getRoleMemberForRoleMemberId(member.getRoleMemberId());
448 if(roleMember!=null){
449 pndMember.setRoleMemberName(getMemberName(roleMember.getType(), roleMember.getMemberId()));
450 pndMember.setRoleMemberNamespaceCode(getMemberNamespaceCode(roleMember.getType(), roleMember.getMemberId()));
451 }
452 pndMember.setMemberNamespaceCode(getMemberNamespaceCode(member.getType(), member.getMemberId()));
453 pndMember.setMemberName(getMemberName(member.getType(), member.getMemberId()));
454 pndMember.setEdit(true);
455 pndMember.setQualifiers(loadDelegationMemberQualifiers(identityManagementPersonDocument, pndMember.getAttributesHelper().getDefinitions(), member.getAttributeDetails()));
456 pndMembers.add(pndMember);
457 }
458 }
459 }
460 return pndMembers;
461 }
462
463 protected List<RoleDocumentDelegationMemberQualifier> loadDelegationMemberQualifiers(IdentityManagementPersonDocument identityManagementPersonDocument,
464 List<KimAttributeField> origAttributeDefinitions, List<DelegateMemberAttributeDataBo> attributeDataList){
465 List<RoleDocumentDelegationMemberQualifier> pndMemberRoleQualifiers = new ArrayList<RoleDocumentDelegationMemberQualifier>();
466 RoleDocumentDelegationMemberQualifier pndMemberRoleQualifier;
467 boolean attributePresent = false;
468 String origAttributeId;
469 if(origAttributeDefinitions!=null){
470 for(KimAttributeField key: origAttributeDefinitions) {
471 origAttributeId = identityManagementPersonDocument.getKimAttributeDefnId(key);
472 if(ObjectUtils.isNotNull(attributeDataList)){
473 for(DelegateMemberAttributeDataBo memberRoleQualifier: attributeDataList){
474 if(StringUtils.equals(origAttributeId, memberRoleQualifier.getKimAttribute().getId())){
475 pndMemberRoleQualifier = new RoleDocumentDelegationMemberQualifier();
476 pndMemberRoleQualifier.setAttrDataId(memberRoleQualifier.getId());
477 pndMemberRoleQualifier.setAttrVal(memberRoleQualifier.getAttributeValue());
478 pndMemberRoleQualifier.setDelegationMemberId(memberRoleQualifier.getAssignedToId());
479 pndMemberRoleQualifier.setKimTypId(memberRoleQualifier.getKimTypeId());
480 pndMemberRoleQualifier.setKimAttrDefnId(memberRoleQualifier.getKimAttributeId());
481 pndMemberRoleQualifier.setKimAttribute(memberRoleQualifier.getKimAttribute());
482 pndMemberRoleQualifiers.add(pndMemberRoleQualifier);
483 attributePresent = true;
484 }
485 }
486 }
487 if(!attributePresent){
488 pndMemberRoleQualifier = new RoleDocumentDelegationMemberQualifier();
489 pndMemberRoleQualifier.setKimAttrDefnId(origAttributeId);
490 pndMemberRoleQualifiers.add(pndMemberRoleQualifier);
491 }
492 attributePresent = false;
493 }
494 }
495 return pndMemberRoleQualifiers;
496 }
497
498 /**
499 *
500 * This method loads related group data to pending person document when user initiates the 'edit' or 'inquiry'.
501 *
502 * @param identityManagementPersonDocument
503 * @param groups
504 */
505 protected void loadGroupToPersonDoc(IdentityManagementPersonDocument identityManagementPersonDocument, List<? extends Group> groups) {
506 List <PersonDocumentGroup> docGroups = new ArrayList <PersonDocumentGroup>();
507 if(ObjectUtils.isNotNull(groups)){
508 for (Group group: groups) {
509 if (getGroupService().isDirectMemberOfGroup(identityManagementPersonDocument.getPrincipalId(), group.getId())) {
510 PersonDocumentGroup docGroup = new PersonDocumentGroup();
511 docGroup.setGroupId(group.getId());
512 docGroup.setGroupName(group.getName());
513 docGroup.setNamespaceCode(group.getNamespaceCode());
514 docGroup.setPrincipalId(identityManagementPersonDocument.getPrincipalId());
515 Collection<GroupMember> groupMemberships = null;
516 groupMemberships = getGroupService().getMembersOfGroup(group.getId());
517
518 if(ObjectUtils.isNotNull(groupMemberships)){
519 for (GroupMember groupMember: groupMemberships) {
520 if (StringUtils.equals(groupMember.getMemberId(), identityManagementPersonDocument.getPrincipalId()) &&
521 KimGroupMemberTypes.PRINCIPAL_MEMBER_TYPE.equals(groupMember.getType())) {
522 docGroup.setGroupMemberId(groupMember.getId());
523 if (groupMember.getActiveFromDate() != null) {
524 docGroup.setActiveFromDate(groupMember.getActiveFromDate() == null ? null : new Timestamp(groupMember.getActiveFromDate().getMillis()));
525 }
526 if (groupMember.getActiveToDate() != null) {
527 docGroup.setActiveToDate(groupMember.getActiveToDate() == null ? null : new Timestamp(groupMember.getActiveToDate().getMillis()));
528 }
529 continue;
530 }
531 }
532 }
533 docGroup.setKimTypeId(group.getKimTypeId());
534 docGroup.setEdit(true);
535 docGroups.add(docGroup);
536 }
537 }
538 }
539 identityManagementPersonDocument.setGroups(docGroups);
540 }
541
542 /**
543 * Used to populate the {@link PersonDocumentRole} objects for a {@link IdentityManagementPersonDocument}
544 *
545 * @param identityManagementPersonDocument {@link IdentityManagementPersonDocument}
546 */
547 protected void loadRoleToPersonDoc(IdentityManagementPersonDocument identityManagementPersonDocument) {
548 List <PersonDocumentRole> docRoles = new ArrayList <PersonDocumentRole>();
549 // a list for Id's of the roles added to docRoles
550 List<String> roleIds = new ArrayList<String>();
551
552 // get the membership objects for the PrincipalId
553 List<RoleMemberBo> roleMembers = getRoleMembersForPrincipal(identityManagementPersonDocument.getPrincipalId());
554
555 // if the PrincipalId is a member of any roles, add those roles to docRoles
556 if(ObjectUtils.isNotNull(roleMembers)){
557 // for each membership get the role and add it, if not already added
558 for (RoleMemberBo member : roleMembers) {
559 if(member.isActive() && !roleIds.contains(member.getRoleId())) {
560 loadDocRoles(docRoles, roleIds, member, roleMembers);
561 }
562 }
563 }
564
565 // complete the attributes for each role being being returned
566 for (PersonDocumentRole role : docRoles) {
567 role.setDefinitions(getAttributeDefinitionsForRole(role));
568
569 KimDocumentRoleMember newRolePrncpl = new KimDocumentRoleMember();
570 newRolePrncpl.setMemberTypeCode(MemberType.PRINCIPAL.getCode());
571 newRolePrncpl.setMemberId(identityManagementPersonDocument.getPrincipalId());
572 role.setNewRolePrncpl(newRolePrncpl);
573
574 if(role.getDefinitions()!=null){
575 for (KimAttributeField key : role.getDefinitions()) {
576 KimDocumentRoleQualifier qualifier = new KimDocumentRoleQualifier();
577 setAttrDefnIdForQualifier(qualifier,key);
578 role.getNewRolePrncpl().getQualifiers().add(qualifier);
579 }
580 }
581
582 // load the role's ResponsibilityActions
583 loadRoleRstAction(role);
584
585 role.setAttributeEntry( getAttributeEntries( role.getDefinitions() ) );
586 }
587
588 // add the PersonDocumentRoles to the IdentityManagementPersonDocument
589 identityManagementPersonDocument.setRoles(docRoles);
590 }
591
592 /**
593 * Selects a {@link RoleBoLite} for passed {@link RoleMemberBo} and adds to List of {@link PersonDocumentRole} objects
594 *
595 * @param docRoles a list of {@link PersonDocumentRole} roles
596 * @param roleIds a list of the Ids of the Roles already added
597 * @param member a {@link RoleMemberBo} of a {@link RoleBoLite}
598 * @param roleMembers a list of {@link RoleMemberBo} membership objects for the PrincipalId
599 */
600 private void loadDocRoles(List <PersonDocumentRole> docRoles, List<String> roleIds, RoleMemberBo member, List<RoleMemberBo> roleMembers) {
601
602 // get the RoleBoLite object by it's Id from a role membership object
603 RoleBoLite role = getBusinessObjectService().findBySinglePrimaryKey(RoleBoLite.class, member.getRoleId());
604
605 // create list of RoleMemberBo's for the same role
606 List<RoleMemberBo> matchingMembers = new ArrayList<RoleMemberBo>();
607 for (RoleMemberBo tempMember : roleMembers) {
608 if (tempMember.getRoleId().equals(member.getRoleId())){
609 matchingMembers.add(tempMember);
610 }
611 }
612
613 // if not already found add role to docRoles
614 if (ObjectUtils.isNotNull(role) && !roleIds.contains(role.getId())) {
615 PersonDocumentRole docRole = new PersonDocumentRole();
616 docRole.setKimTypeId(role.getKimTypeId());
617 docRole.setActive(role.isActive());
618 docRole.setNamespaceCode(role.getNamespaceCode());
619 docRole.setEdit(true);
620 docRole.setRoleId(role.getId());
621 docRole.setRoleName(role.getName());
622 docRole.refreshReferenceObject("assignedResponsibilities");
623 docRole.setRolePrncpls(populateDocRolePrncpl(role.getNamespaceCode(), matchingMembers, member.getMemberId(), getAttributeDefinitionsForRole(docRole)));
624 docRoles.add(docRole);
625 roleIds.add(role.getId());
626 }
627 }
628
629 protected List<KimAttributeField> getAttributeDefinitionsForRole(PersonDocumentRole role) {
630 KimTypeService kimTypeService = KimFrameworkServiceLocator.getKimTypeService(KimTypeBo.to(
631 role.getKimRoleType()));
632 //it is possible that the the kimTypeService is coming from a remote application
633 // and therefore it can't be guarenteed that it is up and working, so using a try/catch to catch this possibility.
634 try {
635 if ( kimTypeService != null ) {
636 return kimTypeService.getAttributeDefinitions(role.getKimTypeId());
637 }
638 } catch (Exception ex) {
639 LOG.warn("Not able to retrieve KimTypeService from remote system for KIM Role Type: " + role.getKimRoleType(), ex);
640 }
641 return Collections.emptyList();
642 }
643
644 protected void loadRoleRstAction(PersonDocumentRole role) {
645 if(role!=null && CollectionUtils.isNotEmpty(role.getRolePrncpls())){
646 for (KimDocumentRoleMember roleMbr : role.getRolePrncpls()) {
647 List<RoleResponsibilityActionBo> actions = getRoleRspActions( roleMbr.getRoleMemberId());
648 if(ObjectUtils.isNotNull(actions)){
649 for (RoleResponsibilityActionBo entRoleRspAction :actions) {
650 KimDocumentRoleResponsibilityAction roleRspAction = new KimDocumentRoleResponsibilityAction();
651 roleRspAction.setRoleResponsibilityActionId(entRoleRspAction.getId());
652 roleRspAction.setRoleResponsibilityId(entRoleRspAction.getRoleResponsibilityId());
653 roleRspAction.setActionTypeCode(entRoleRspAction.getActionTypeCode());
654 roleRspAction.setActionPolicyCode(entRoleRspAction.getActionPolicyCode());
655 roleRspAction.setPriorityNumber(entRoleRspAction.getPriorityNumber());
656 roleRspAction.setRoleResponsibilityActionId(entRoleRspAction.getId());
657 roleRspAction.refreshReferenceObject("roleResponsibility");
658 roleMbr.getRoleRspActions().add(roleRspAction);
659 }
660 }
661 }
662 }
663 }
664
665 protected void setAttrDefnIdForQualifier(KimDocumentRoleQualifier qualifier, KimAttributeField definition) {
666 qualifier.setKimAttrDefnId(getAttributeDefnId(definition));
667 qualifier.refreshReferenceObject("kimAttribute");
668 }
669
670 protected String getAttributeDefnId(KimAttributeField definition) {
671 return definition.getId();
672 }
673
674 private PrincipalBo getPrincipalImpl(String principalId) {
675 Map<String,String> criteria = new HashMap<String,String>(1);
676 criteria.put(KIMPropertyConstants.Principal.PRINCIPAL_ID, principalId);
677 return (PrincipalBo)getBusinessObjectService().findByPrimaryKey(PrincipalBo.class, criteria);
678 }
679
680 public List<EntityEmployment> getEntityEmploymentInformationInfo(String entityId) {
681 EntityBo entityImpl = getEntityBo(entityId);
682 List<EntityEmployment> empInfos = new ArrayList<EntityEmployment>();
683 EntityEmployment empInfo;
684 if(ObjectUtils.isNotNull(entityImpl) && CollectionUtils.isNotEmpty(entityImpl.getEmploymentInformation())){
685 for(EntityEmploymentBo empImpl: entityImpl.getEmploymentInformation()){
686 empInfos.add(EntityEmploymentBo.to(empImpl));
687 }
688 }
689 return empInfos;
690 }
691
692 private EntityBo getEntityBo(String entityId) {
693 EntityBo entityImpl = getBusinessObjectService().findBySinglePrimaryKey(EntityBo.class, entityId);
694 //TODO - remove this hack... This is here because currently jpa only seems to be going 2 levels deep on the eager fetching.
695 if(entityImpl!=null && entityImpl.getEntityTypeContactInfos() != null) {
696 for (EntityTypeContactInfoBo et : entityImpl.getEntityTypeContactInfos()) {
697 et.refresh();
698 }
699 }
700 return entityImpl;
701 }
702
703 @SuppressWarnings("unchecked")
704 protected List<RoleBo> getRolesForPrincipal(String principalId) {
705 if ( principalId == null ) {
706 return new ArrayList<RoleBo>();
707 }
708 Map<String,String> criteria = new HashMap<String,String>( 2 );
709 criteria.put("members.memberId", principalId);
710 criteria.put("members.typeCode", MemberType.PRINCIPAL.getCode());
711 return (List<RoleBo>)getBusinessObjectService().findMatching(RoleBo.class, criteria);
712 }
713
714 @SuppressWarnings("unchecked")
715 protected List<RoleMemberBo> getRoleMembersForPrincipal(String principalId) {
716 if ( principalId == null ) {
717 return new ArrayList<RoleMemberBo>();
718 }
719 Map<String,String> criteria = new HashMap<String,String>( 2 );
720 criteria.put("memberId", principalId);
721 criteria.put("typeCode", MemberType.PRINCIPAL.getCode());
722 return (List<RoleMemberBo>)getBusinessObjectService().findMatching(RoleMemberBo.class, criteria);
723 }
724
725 public RoleMemberBo getRoleMember(String id) {
726 if ( id == null ) {
727 return null;
728 }
729 Map<String,String> criteria = new HashMap<String,String>( 2 );
730 criteria.put("id", id);
731 return getBusinessObjectService().findByPrimaryKey(RoleMemberBo.class, criteria);
732 }
733
734 @SuppressWarnings("unchecked")
735 protected List<RoleResponsibilityActionBo> getRoleRspActions(String roleMemberId) {
736 Map<String,String> criteria = new HashMap<String,String>( 1 );
737 criteria.put(KIMPropertyConstants.RoleMember.ROLE_MEMBER_ID, roleMemberId);
738 return (List<RoleResponsibilityActionBo>)getBusinessObjectService().findMatching(RoleResponsibilityActionBo.class, criteria);
739 }
740
741 protected List<KimDocumentRoleMember> populateDocRolePrncpl(String namespaceCode, List <RoleMemberBo> roleMembers, String principalId, List<KimAttributeField> definitions) {
742 List <KimDocumentRoleMember> docRoleMembers = new ArrayList <KimDocumentRoleMember>();
743 if(ObjectUtils.isNotNull(roleMembers)){
744 for (RoleMemberBo rolePrincipal : roleMembers) {
745 if (rolePrincipal.isActive(new Timestamp(System.currentTimeMillis())) && MemberType.PRINCIPAL.equals(
746 rolePrincipal.getType()) &&
747 StringUtils.equals(rolePrincipal.getMemberId(), principalId)) {
748 KimDocumentRoleMember docRolePrncpl = new KimDocumentRoleMember();
749 docRolePrncpl.setMemberId(rolePrincipal.getMemberId());
750 docRolePrncpl.setRoleMemberId(rolePrincipal.getId());
751 docRolePrncpl.setActive(rolePrincipal.isActive(new Timestamp(System.currentTimeMillis())));
752 docRolePrncpl.setRoleId(rolePrincipal.getRoleId());
753 docRolePrncpl.setActiveFromDate(rolePrincipal.getActiveFromDateValue());
754 docRolePrncpl.setActiveToDate(rolePrincipal.getActiveToDateValue());
755 docRolePrncpl.setQualifiers(populateDocRoleQualifier(namespaceCode, rolePrincipal.getAttributeDetails(), definitions));
756 docRolePrncpl.setEdit(true);
757 docRoleMembers.add(docRolePrncpl);
758 }
759 }
760 }
761 return docRoleMembers;
762 }
763
764 // UI layout for rolequalifier is a little different from kimroleattribute set up.
765 // each principal may have member with same role multiple times with different qualifier, but the role
766 // only displayed once, and the qualifier displayed multiple times.
767 protected List<KimDocumentRoleQualifier> populateDocRoleQualifier(String namespaceCode, List <RoleMemberAttributeDataBo> qualifiers, List<KimAttributeField> definitions) {
768
769 List <KimDocumentRoleQualifier> docRoleQualifiers = new ArrayList <KimDocumentRoleQualifier>();
770 if(definitions!=null){
771 for (KimAttributeField definition : definitions) {
772 String attrDefId=definition.getId();
773 boolean qualifierFound = false;
774 if(ObjectUtils.isNotNull(qualifiers)){
775 for (RoleMemberAttributeDataBo qualifier : qualifiers) {
776 if (attrDefId!=null && StringUtils.equals(attrDefId, qualifier.getKimAttributeId())) {
777 KimDocumentRoleQualifier docRoleQualifier = new KimDocumentRoleQualifier();
778 docRoleQualifier.setAttrDataId(qualifier.getId());
779 docRoleQualifier.setAttrVal(qualifier.getAttributeValue());
780 docRoleQualifier.setKimAttrDefnId(qualifier.getKimAttributeId());
781 docRoleQualifier.setKimAttribute(qualifier.getKimAttribute());
782 docRoleQualifier.setKimTypId(qualifier.getKimTypeId());
783 docRoleQualifier.setRoleMemberId(qualifier.getAssignedToId());
784 docRoleQualifier.setEdit(true);
785 formatAttrValIfNecessary(docRoleQualifier);
786 docRoleQualifiers.add(docRoleQualifier);
787 qualifierFound = true;
788 break;
789 }
790 }
791 }
792 if (!qualifierFound) {
793 KimDocumentRoleQualifier docRoleQualifier = new KimDocumentRoleQualifier();
794 docRoleQualifier.setAttrVal("");
795 docRoleQualifier.setKimAttrDefnId(attrDefId);
796 docRoleQualifier.refreshReferenceObject("kimAttribute");
797 docRoleQualifiers.add(docRoleQualifier);
798 }
799 }
800 // If all of the qualifiers are empty, return an empty list
801 // This is to prevent dynamic qualifiers from appearing in the
802 // person maintenance roles tab. see KULRICE-3989 for more detail
803 // and KULRICE-5071 for detail on switching from config value to
804 // application-scoped parameter
805 if (!isBlankRoleQualifierVisible(namespaceCode)) {
806 int qualCount = 0;
807 for (KimDocumentRoleQualifier qual : docRoleQualifiers){
808 if (StringUtils.isEmpty(qual.getAttrVal())){
809 qualCount++;
810 }
811 }
812 if (qualCount == docRoleQualifiers.size()){
813 return new ArrayList <KimDocumentRoleQualifier>();
814 }
815 }
816 }
817 return docRoleQualifiers;
818 }
819
820 protected List<PersonDocumentName> loadNames( IdentityManagementPersonDocument personDoc, String principalId, List <EntityName> names, boolean suppressDisplay ) {
821 List<PersonDocumentName> docNames = new ArrayList<PersonDocumentName>();
822 if(ObjectUtils.isNotNull(names)){
823 for (EntityName name: names) {
824 if(name.isActive()){
825 PersonDocumentName docName = new PersonDocumentName();
826 if (name.getNameType() != null) {
827 docName.setNameCode(name.getNameType().getCode());
828 }
829
830 //We do not need to check the privacy setting here - The UI should care of it
831 docName.setFirstName(name.getFirstNameUnmasked());
832 docName.setLastName(name.getLastNameUnmasked());
833 docName.setMiddleName(name.getMiddleNameUnmasked());
834 docName.setNamePrefix(name.getNamePrefixUnmasked());
835 docName.setNameSuffix(name.getNameSuffixUnmasked());
836
837 docName.setActive(name.isActive());
838 docName.setDflt(name.isDefaultValue());
839 docName.setEdit(true);
840 docName.setEntityNameId(name.getId());
841 docNames.add(docName);
842 }
843 }
844 }
845 return docNames;
846 }
847
848 public boolean canModifyEntity( String currentUserPrincipalId, String toModifyPrincipalId ){
849 return (StringUtils.isNotBlank(currentUserPrincipalId) && StringUtils.isNotBlank(toModifyPrincipalId) &&
850 currentUserPrincipalId.equals(toModifyPrincipalId)) ||
851 getPermissionService().isAuthorized(
852 currentUserPrincipalId,
853 KimConstants.NAMESPACE_CODE,
854 KimConstants.PermissionNames.MODIFY_ENTITY,
855 Collections.singletonMap(KimConstants.AttributeConstants.PRINCIPAL_ID, currentUserPrincipalId));
856 }
857
858 public boolean canOverrideEntityPrivacyPreferences( String currentUserPrincipalId, String toModifyPrincipalId ){
859 return (StringUtils.isNotBlank(currentUserPrincipalId) && StringUtils.isNotBlank(toModifyPrincipalId) &&
860 currentUserPrincipalId.equals(toModifyPrincipalId)) ||
861 getPermissionService().isAuthorized(
862 currentUserPrincipalId,
863 KimConstants.NAMESPACE_CODE,
864 KimConstants.PermissionNames.OVERRIDE_ENTITY_PRIVACY_PREFERENCES,
865 Collections.singletonMap(KimConstants.AttributeConstants.PRINCIPAL_ID, currentUserPrincipalId) );
866 }
867
868 protected boolean canAssignToRole(IdentityManagementRoleDocument document, String initiatorPrincipalId){
869 boolean rulePassed = true;
870 Map<String,String> additionalPermissionDetails = new HashMap<String,String>();
871 additionalPermissionDetails.put(KimConstants.AttributeConstants.NAMESPACE_CODE, document.getRoleNamespace());
872 additionalPermissionDetails.put(KimConstants.AttributeConstants.ROLE_NAME, document.getRoleName());
873 if(!getDocumentHelperService().getDocumentAuthorizer(document).isAuthorizedByTemplate(
874 document, KimConstants.NAMESPACE_CODE, KimConstants.PermissionTemplateNames.ASSIGN_ROLE,
875 initiatorPrincipalId, additionalPermissionDetails, null)){
876 rulePassed = false;
877 }
878 return rulePassed;
879 }
880
881 protected List<PersonDocumentAffiliation> loadAffiliations(List <EntityAffiliation> affiliations, List<EntityEmployment> empInfos) {
882 List<PersonDocumentAffiliation> docAffiliations = new ArrayList<PersonDocumentAffiliation>();
883 if(ObjectUtils.isNotNull(affiliations)){
884 for (EntityAffiliation affiliation: affiliations) {
885 if(affiliation.isActive()){
886 PersonDocumentAffiliation docAffiliation = new PersonDocumentAffiliation();
887 docAffiliation.setAffiliationTypeCode(affiliation.getAffiliationType().getCode());
888 docAffiliation.setCampusCode(affiliation.getCampusCode());
889 docAffiliation.setActive(affiliation.isActive());
890 docAffiliation.setDflt(affiliation.isDefaultValue());
891 docAffiliation.setEntityAffiliationId(affiliation.getId());
892 docAffiliation.refreshReferenceObject("affiliationType");
893 // EntityAffiliationImpl does not define empinfos as collection
894 docAffiliations.add(docAffiliation);
895 docAffiliation.setEdit(true);
896 // employment informations
897 List<PersonDocumentEmploymentInfo> docEmploymentInformations = new ArrayList<PersonDocumentEmploymentInfo>();
898 if(ObjectUtils.isNotNull(empInfos)){
899 for (EntityEmployment empInfo: empInfos) {
900 if (empInfo.isActive()
901 && StringUtils.equals(docAffiliation.getEntityAffiliationId(),
902 (empInfo.getEntityAffiliation() != null ? empInfo.getEntityAffiliation().getId() : null))) {
903 PersonDocumentEmploymentInfo docEmpInfo = new PersonDocumentEmploymentInfo();
904 docEmpInfo.setEntityEmploymentId(empInfo.getEmployeeId());
905 docEmpInfo.setEmployeeId(empInfo.getEmployeeId());
906 docEmpInfo.setEmploymentRecordId(empInfo.getEmploymentRecordId());
907 docEmpInfo.setBaseSalaryAmount(empInfo.getBaseSalaryAmount());
908 docEmpInfo.setPrimaryDepartmentCode(empInfo.getPrimaryDepartmentCode());
909 docEmpInfo.setEmploymentStatusCode(empInfo.getEmployeeStatus() != null ? empInfo.getEmployeeStatus().getCode() : null);
910 docEmpInfo.setEmploymentTypeCode(empInfo.getEmployeeType() != null ? empInfo.getEmployeeType().getCode() : null);
911 docEmpInfo.setActive(empInfo.isActive());
912 docEmpInfo.setPrimary(empInfo.isPrimary());
913 docEmpInfo.setEntityAffiliationId(empInfo.getEntityAffiliation() != null ? empInfo.getEntityAffiliation().getId() : null);
914 // there is no version number on KimEntityEmploymentInformationInfo
915 //docEmpInfo.setVersionNumber(empInfo.getVersionNumber());
916 docEmpInfo.setEdit(true);
917 docEmpInfo.refreshReferenceObject("employmentType");
918 docEmploymentInformations.add(docEmpInfo);
919 }
920 }
921 }
922 docAffiliation.setEmpInfos(docEmploymentInformations);
923 }
924 }
925 }
926 return docAffiliations;
927
928 }
929
930 protected boolean setupPrincipal(IdentityManagementPersonDocument identityManagementPersonDocument, EntityBo kimEntity, List<PrincipalBo> origPrincipals) {
931 boolean inactivatingPrincipal = false;
932 List<PrincipalBo> principals = new ArrayList<PrincipalBo>();
933 PrincipalBo principal = new PrincipalBo();
934 principal.setPrincipalName(identityManagementPersonDocument.getPrincipalName());
935 principal.setPrincipalId(identityManagementPersonDocument.getPrincipalId());
936 principal.setActive(identityManagementPersonDocument.isActive());
937 principal.setEntityId(identityManagementPersonDocument.getEntityId());
938 if(ObjectUtils.isNotNull(origPrincipals)){
939 for (PrincipalBo prncpl : origPrincipals) {
940 if (prncpl.getPrincipalId()!=null && StringUtils.equals(prncpl.getPrincipalId(), principal.getPrincipalId())) {
941 principal.setVersionNumber(prncpl.getVersionNumber());
942 principal.setObjectId(prncpl.getObjectId());
943 principal.setPassword(prncpl.getPassword());
944 // check if inactivating the principal
945 if ( prncpl.isActive() && !principal.isActive() ) {
946 inactivatingPrincipal = true;
947 }
948 }
949 }
950 }
951 principals.add(principal);
952
953 kimEntity.setPrincipals(principals);
954 return inactivatingPrincipal;
955 }
956
957 protected void setupPrivacy(IdentityManagementPersonDocument identityManagementPersonDocument, EntityBo kimEntity, EntityPrivacyPreferencesBo origPrivacy) {
958 EntityPrivacyPreferencesBo privacyPreferences = new EntityPrivacyPreferencesBo();
959 privacyPreferences.setEntityId(identityManagementPersonDocument.getEntityId());
960 privacyPreferences.setSuppressAddress(identityManagementPersonDocument.getPrivacy().isSuppressAddress());
961 privacyPreferences.setSuppressEmail(identityManagementPersonDocument.getPrivacy().isSuppressEmail());
962 privacyPreferences.setSuppressName(identityManagementPersonDocument.getPrivacy().isSuppressName());
963 privacyPreferences.setSuppressPhone(identityManagementPersonDocument.getPrivacy().isSuppressPhone());
964 privacyPreferences.setSuppressPersonal(identityManagementPersonDocument.getPrivacy().isSuppressPersonal());
965 if (ObjectUtils.isNotNull(origPrivacy)) {
966 privacyPreferences.setVersionNumber(origPrivacy.getVersionNumber());
967 privacyPreferences.setObjectId(origPrivacy.getObjectId());
968 }
969 kimEntity.setPrivacyPreferences(privacyPreferences);
970 }
971 protected PersonDocumentPrivacy loadPrivacyReferences(EntityPrivacyPreferences privacyPreferences) {
972 PersonDocumentPrivacy docPrivacy = new PersonDocumentPrivacy();
973 docPrivacy.setSuppressAddress(privacyPreferences.isSuppressAddress());
974 docPrivacy.setSuppressEmail(privacyPreferences.isSuppressEmail());
975 docPrivacy.setSuppressName(privacyPreferences.isSuppressName());
976 docPrivacy.setSuppressPhone(privacyPreferences.isSuppressPhone());
977 docPrivacy.setSuppressPersonal(privacyPreferences.isSuppressPersonal());
978 docPrivacy.setEdit(true);
979 return docPrivacy;
980 }
981
982 protected void setupName(IdentityManagementPersonDocument identityManagementPersonDocument, EntityBo kimEntity, List<EntityNameBo> origNames) {
983 if ( !identityManagementPersonDocument.getPrivacy().isSuppressName() ||
984 canOverrideEntityPrivacyPreferences( getInitiatorPrincipalId(identityManagementPersonDocument), identityManagementPersonDocument.getPrincipalId() ) ) {
985 List<EntityNameBo> entityNames = new ArrayList<EntityNameBo>();
986 if(CollectionUtils.isNotEmpty(identityManagementPersonDocument.getNames())){
987 for (PersonDocumentName name : identityManagementPersonDocument.getNames()) {
988 EntityNameBo entityName = new EntityNameBo();
989 entityName.setNameCode(name.getNameCode());
990 if (name.getEntityNameType() != null) {
991 entityName.setNameType(name.getEntityNameType());
992 } else {
993 if (StringUtils.isNotEmpty(name.getNameCode())) {
994 entityName.setNameType(
995 EntityNameTypeBo.from(getIdentityService().getNameType(name.getNameCode())));
996 }
997 }
998 entityName.setFirstName(name.getFirstName());
999 entityName.setLastName(name.getLastName());
1000 entityName.setMiddleName(name.getMiddleName());
1001 entityName.setNamePrefix(name.getNamePrefix());
1002 entityName.setNameSuffix(name.getNameSuffix());
1003 entityName.setActive(name.isActive());
1004 entityName.setDefaultValue(name.isDflt());
1005 entityName.setId(name.getEntityNameId());
1006 entityName.setEntityId(identityManagementPersonDocument.getEntityId());
1007 if(ObjectUtils.isNotNull(origNames)){
1008 for (EntityNameBo origName : origNames) {
1009 if (origName.getId()!=null && StringUtils.equals(origName.getId(), entityName.getId())) {
1010 entityName.setVersionNumber(origName.getVersionNumber());
1011 }
1012
1013 }
1014 }
1015 entityNames.add(entityName);
1016 }
1017 }
1018 kimEntity.setNames(entityNames);
1019 }
1020 }
1021
1022 protected void setupAffiliation(IdentityManagementPersonDocument identityManagementPersonDocument, EntityBo kimEntity,List<EntityAffiliationBo> origAffiliations, List<EntityEmploymentBo> origEmpInfos) {
1023 List<EntityAffiliationBo> entityAffiliations = new ArrayList<EntityAffiliationBo>();
1024 // employment informations
1025 List<EntityEmploymentBo> entityEmploymentInformations = new ArrayList<EntityEmploymentBo>();
1026 if(CollectionUtils.isNotEmpty(identityManagementPersonDocument.getAffiliations())){
1027 for (PersonDocumentAffiliation affiliation : identityManagementPersonDocument.getAffiliations()) {
1028 EntityAffiliationBo entityAffiliation = new EntityAffiliationBo();
1029 entityAffiliation.setAffiliationTypeCode(affiliation.getAffiliationTypeCode());
1030 if (affiliation.getAffiliationType() != null) {
1031 entityAffiliation.setAffiliationType(affiliation.getAffiliationType());
1032 } else {
1033 if (StringUtils.isNotEmpty(affiliation.getAffiliationTypeCode())) {
1034 entityAffiliation.setAffiliationType(EntityAffiliationTypeBo.from(getIdentityService().getAffiliationType(
1035 affiliation.getAffiliationTypeCode())));
1036 }
1037 }
1038 entityAffiliation.setCampusCode(affiliation.getCampusCode());
1039 entityAffiliation.setActive(affiliation.isActive());
1040 entityAffiliation.setDefaultValue(affiliation.isDflt());
1041 entityAffiliation.setEntityId(identityManagementPersonDocument.getEntityId());
1042 entityAffiliation.setId(affiliation.getEntityAffiliationId());
1043 if(ObjectUtils.isNotNull(origAffiliations)){
1044 // EntityAffiliationImpl does not define empinfos as collection
1045 for (EntityAffiliationBo origAffiliation : origAffiliations) {
1046 if(isSameAffiliation(origAffiliation, entityAffiliation)){
1047 entityAffiliation.setId(origAffiliation.getId());
1048 }
1049 if (origAffiliation.getId()!=null && StringUtils.equals(origAffiliation.getId(), entityAffiliation.getId())) {
1050 entityAffiliation.setVersionNumber(origAffiliation.getVersionNumber());
1051 }
1052 }
1053 }
1054 entityAffiliations.add(entityAffiliation);
1055 int employeeRecordCounter = origEmpInfos==null?0:origEmpInfos.size();
1056 if(CollectionUtils.isNotEmpty(affiliation.getEmpInfos())){
1057 for (PersonDocumentEmploymentInfo empInfo : affiliation.getEmpInfos()) {
1058 EntityEmploymentBo entityEmpInfo = new EntityEmploymentBo();
1059 entityEmpInfo.setId(empInfo.getEntityEmploymentId());
1060 entityEmpInfo.setEmployeeId(empInfo.getEmployeeId());
1061 entityEmpInfo.setEmploymentRecordId(empInfo.getEmploymentRecordId());
1062 entityEmpInfo.setBaseSalaryAmount(empInfo.getBaseSalaryAmount());
1063 entityEmpInfo.setPrimaryDepartmentCode(empInfo.getPrimaryDepartmentCode());
1064 entityEmpInfo.setEmployeeStatusCode(empInfo.getEmploymentStatusCode());
1065 if (empInfo.getEmploymentStatus() != null) {
1066 entityEmpInfo.setEmployeeStatus(empInfo.getEmploymentStatus());
1067 } else {
1068 if (StringUtils.isNotEmpty(empInfo.getEmploymentStatusCode())) {
1069 entityEmpInfo.setEmployeeStatus(EntityEmploymentStatusBo
1070 .from(getIdentityService().getEmploymentStatus(empInfo.getEmploymentStatusCode())));
1071 }
1072 }
1073 entityEmpInfo.setEmployeeTypeCode(empInfo.getEmploymentTypeCode());
1074 if (empInfo.getEmploymentType() != null) {
1075 entityEmpInfo.setEmployeeType(empInfo.getEmploymentType());
1076 } else {
1077 if (StringUtils.isNotEmpty(empInfo.getEmploymentTypeCode())) {
1078 entityEmpInfo.setEmployeeType(EntityEmploymentTypeBo
1079 .from(getIdentityService().getEmploymentType(empInfo.getEmploymentTypeCode())));
1080 }
1081 }
1082 entityEmpInfo.setActive(empInfo.isActive());
1083 entityEmpInfo.setPrimary(empInfo.isPrimary());
1084 entityEmpInfo.setEntityId(identityManagementPersonDocument.getEntityId());
1085 entityEmpInfo.setEntityAffiliationId(empInfo.getEntityAffiliationId());
1086 if(ObjectUtils.isNotNull(origEmpInfos)){
1087 for (EntityEmploymentBo origEmpInfo : origEmpInfos) {
1088 if(isSameEmpInfo(origEmpInfo, entityEmpInfo)){
1089 entityEmpInfo.setId(origEmpInfo.getId());
1090 }
1091
1092 if (origEmpInfo.getId()!=null && StringUtils.equals(origEmpInfo.getId(), entityEmpInfo.getId())) {
1093 entityEmpInfo.setVersionNumber(origEmpInfo.getVersionNumber());
1094 entityEmpInfo.setEmploymentRecordId(empInfo.getEmploymentRecordId());
1095 }
1096 }
1097 }
1098 if(StringUtils.isEmpty(entityEmpInfo.getEmploymentRecordId())){
1099 employeeRecordCounter++;
1100 entityEmpInfo.setEmploymentRecordId(employeeRecordCounter+"");
1101 }
1102 entityEmploymentInformations.add(entityEmpInfo);
1103 }
1104 }
1105 }
1106 }
1107 kimEntity.setEmploymentInformation(entityEmploymentInformations);
1108 kimEntity.setAffiliations(entityAffiliations);
1109 }
1110
1111 /*
1112 * Added to address KULRICE-5071 : "Move the 'show blank qualifier' kim toggle from a Config param to a System param"
1113 *
1114 * This method first checks for a namespace specific parameter with a detailTypeCode of "All" and parameterName of "KIM_SHOW_BLANK_QUALIFIERS".
1115 * If no parameter is found, it checks for the config property "kim.show.blank.qualifiers", and defaults to true if no config property exists.
1116 *
1117 */
1118 private boolean isBlankRoleQualifierVisible(String namespaceCode) {
1119 boolean showBlankQualifiers = true;
1120
1121 Parameter param = getParameterService().getParameter(namespaceCode, KRADConstants.DetailTypes.ALL_DETAIL_TYPE, KimConstants.ParameterKey.SHOW_BLANK_QUALIFIERS);
1122 if (param != null) {
1123 showBlankQualifiers = "Y".equals(param.getValue());
1124 } else {
1125 String configProperty = ConfigContext.getCurrentContextConfig().getProperty(SHOW_BLANK_QUALIFIERS);
1126 if (configProperty != null) {
1127 showBlankQualifiers = Boolean.valueOf(configProperty);
1128 }
1129 }
1130
1131 return showBlankQualifiers;
1132 }
1133
1134 private boolean isSameAffiliation(EntityAffiliationBo origAffiliation, EntityAffiliationBo entityAffiliation){
1135 //entityId
1136 //affiliationTypeCode
1137 //campusCode
1138 return (origAffiliation!=null && entityAffiliation!=null) &&
1139 (StringUtils.isNotEmpty(origAffiliation.getCampusCode()) && StringUtils.equals(origAffiliation.getCampusCode(), entityAffiliation.getCampusCode()))
1140 &&
1141 (StringUtils.isNotEmpty(origAffiliation.getAffiliationTypeCode()) && StringUtils.equals(origAffiliation.getAffiliationTypeCode(), entityAffiliation.getAffiliationTypeCode()))
1142 &&
1143 (StringUtils.isNotEmpty(origAffiliation.getEntityId()) && StringUtils.equals(origAffiliation.getEntityId(), entityAffiliation.getEntityId()));
1144 }
1145
1146 private boolean isSameEmpInfo(EntityEmploymentBo origEmpInfo, EntityEmploymentBo entityEmpInfo){
1147 //emp_info:
1148 //employmentRecordId
1149 //entityId
1150 //These should be unique - add a business rule
1151 return (origEmpInfo!=null && entityEmpInfo!=null)
1152 && (StringUtils.isNotEmpty(origEmpInfo.getEmploymentRecordId())
1153 && StringUtils.equals(origEmpInfo.getEmploymentRecordId(), entityEmpInfo.getEmploymentRecordId() )
1154 )
1155 && StringUtils.equals( origEmpInfo.getEntityId(),entityEmpInfo.getEntityId());
1156 }
1157
1158 protected void setupPhone(IdentityManagementPersonDocument identityManagementPersonDocument, EntityTypeContactInfoBo entityType, List<EntityPhoneBo> origPhones) {
1159 if ( !identityManagementPersonDocument.getPrivacy().isSuppressPhone() || canOverrideEntityPrivacyPreferences(getInitiatorPrincipalId(identityManagementPersonDocument), identityManagementPersonDocument.getPrincipalId()) ) {
1160 List<EntityPhoneBo> entityPhones = new ArrayList<EntityPhoneBo>();
1161 if(CollectionUtils.isNotEmpty(identityManagementPersonDocument.getPhones())){
1162 for (PersonDocumentPhone phone : identityManagementPersonDocument.getPhones()) {
1163 EntityPhoneBo entityPhone = new EntityPhoneBo();
1164 entityPhone.setPhoneTypeCode(phone.getPhoneTypeCode());
1165 if (phone.getPhoneType() != null) {
1166 entityPhone.setPhoneType(phone.getPhoneType());
1167 } else {
1168 if (StringUtils.isNotEmpty(phone.getPhoneTypeCode())) {
1169 entityPhone.setPhoneType(EntityPhoneTypeBo
1170 .from(getIdentityService().getAddressType(phone.getPhoneTypeCode())));
1171 }
1172 }
1173 entityPhone.setEntityId(identityManagementPersonDocument.getEntityId());
1174 entityPhone.setId(phone.getEntityPhoneId());
1175 entityPhone.setEntityTypeCode(entityType.getEntityTypeCode());
1176 entityPhone.setPhoneNumber(phone.getPhoneNumber());
1177 entityPhone.setCountryCode(phone.getCountryCode());
1178 entityPhone.setExtension(phone.getExtension());
1179 entityPhone.setExtensionNumber(phone.getExtensionNumber());
1180 entityPhone.setActive(phone.isActive());
1181 entityPhone.setDefaultValue(phone.isDflt());
1182 if(ObjectUtils.isNotNull(origPhones)){
1183 for (EntityPhoneContract origPhone : origPhones) {
1184 if (origPhone.getId()!=null && StringUtils.equals(origPhone.getId(), entityPhone.getId())) {
1185 entityPhone.setVersionNumber(origPhone.getVersionNumber());
1186 }
1187 }
1188 }
1189 entityPhone.setId(phone.getEntityPhoneId());
1190 entityPhones.add(entityPhone);
1191 }
1192 }
1193 entityType.setPhoneNumbers(entityPhones);
1194 }
1195 }
1196
1197 protected List<PersonDocumentPhone> loadPhones(IdentityManagementPersonDocument identityManagementPersonDocument, String principalId, List<EntityPhone> entityPhones, boolean suppressDisplay ) {
1198 List<PersonDocumentPhone> docPhones = new ArrayList<PersonDocumentPhone>();
1199 if(ObjectUtils.isNotNull(entityPhones)){
1200 for (EntityPhone phone: entityPhones) {
1201 if(phone.isActive()){
1202 PersonDocumentPhone docPhone = new PersonDocumentPhone();
1203 if (phone.getPhoneType() != null) {
1204 docPhone.setPhoneTypeCode(phone.getPhoneType().getCode());
1205 }
1206 //docPhone.setPhoneType(((KimEntityPhoneImpl)phone).getPhoneType());
1207 docPhone.setEntityTypeCode(phone.getEntityTypeCode());
1208 //We do not need to check the privacy setting here - The UI should care of it
1209 docPhone.setPhoneNumber(phone.getPhoneNumberUnmasked());
1210 docPhone.setCountryCode(phone.getCountryCodeUnmasked());
1211 docPhone.setExtensionNumber(phone.getExtensionNumberUnmasked());
1212
1213 docPhone.setActive(phone.isActive());
1214 docPhone.setDflt(phone.isDefaultValue());
1215 docPhone.setEntityPhoneId(phone.getId());
1216 docPhone.setEdit(true);
1217 docPhones.add(docPhone);
1218 }
1219 }
1220 }
1221 return docPhones;
1222
1223 }
1224
1225 protected void setupEmail(
1226 IdentityManagementPersonDocument identityManagementPersonDocument,
1227 EntityTypeContactInfoBo entityType, List<EntityEmailBo> origEmails) {
1228 if ( !identityManagementPersonDocument.getPrivacy().isSuppressEmail() || canOverrideEntityPrivacyPreferences(getInitiatorPrincipalId(identityManagementPersonDocument), identityManagementPersonDocument.getPrincipalId()) ) {
1229 List<EntityEmailBo> entityEmails = new ArrayList<EntityEmailBo>();
1230 if(CollectionUtils.isNotEmpty(identityManagementPersonDocument.getEmails())){
1231 for (PersonDocumentEmail email : identityManagementPersonDocument.getEmails()) {
1232 EntityEmailBo entityEmail = new EntityEmailBo();
1233 entityEmail.setEntityId(identityManagementPersonDocument.getEntityId());
1234 entityEmail.setEntityTypeCode(entityType.getEntityTypeCode());
1235 if (email.getEmailType() != null) {
1236 entityEmail.setEmailType(email.getEmailType());
1237 } else {
1238 if (StringUtils.isNotEmpty(email.getEmailTypeCode())) {
1239 entityEmail.setEmailType(
1240 EntityEmailTypeBo.from(getIdentityService().getEmailType(email.getEmailTypeCode())));
1241 }
1242 }
1243 entityEmail.setEmailTypeCode(email.getEmailTypeCode());
1244 entityEmail.setEmailAddress(email.getEmailAddress());
1245 entityEmail.setActive(email.isActive());
1246 entityEmail.setDefaultValue(email.isDflt());
1247 entityEmail.setId(email.getEntityEmailId());
1248 if(ObjectUtils.isNotNull(origEmails)){
1249 for (EntityEmailContract origEmail : origEmails) {
1250 if (origEmail.getId()!=null && StringUtils.equals(origEmail.getId(), entityEmail.getId())) {
1251 entityEmail.setVersionNumber(origEmail.getVersionNumber());
1252 }
1253 }
1254 }
1255 entityEmails.add(entityEmail);
1256 }
1257 }
1258 entityType.setEmailAddresses(entityEmails);
1259 }
1260 }
1261 protected List<PersonDocumentEmail> loadEmails(IdentityManagementPersonDocument identityManagementPersonDocument, String principalId, List<EntityEmail> entityEmails, boolean suppressDisplay ) {
1262 List<PersonDocumentEmail> emails = new ArrayList<PersonDocumentEmail>();
1263 if(ObjectUtils.isNotNull(entityEmails)){
1264 for (EntityEmail email: entityEmails) {
1265 if(email.isActive()){
1266 PersonDocumentEmail docEmail = new PersonDocumentEmail();
1267 //docEmail.setEntityId(email.getEntityId());
1268 docEmail.setEntityTypeCode(email.getEntityTypeCode());
1269 if (email.getEmailType() != null) {
1270 docEmail.setEmailTypeCode(email.getEmailType().getCode());
1271 }
1272 // EmailType not on info object.
1273 //docEmail.setEmailType(((KimEntityEmailImpl)email).getEmailType());
1274 //We do not need to check the privacy setting here - The UI should care of it
1275 docEmail.setEmailAddress(email.getEmailAddressUnmasked());
1276
1277 docEmail.setActive(email.isActive());
1278 docEmail.setDflt(email.isDefaultValue());
1279 docEmail.setEntityEmailId(email.getId());
1280 docEmail.setEdit(true);
1281 emails.add(docEmail);
1282 }
1283 }
1284 }
1285 return emails;
1286 }
1287
1288 protected void setupAddress(
1289 IdentityManagementPersonDocument identityManagementPersonDocument,
1290 EntityTypeContactInfoBo entityType, List<EntityAddressBo> origAddresses) {
1291 if ( !identityManagementPersonDocument.getPrivacy().isSuppressAddress() || canOverrideEntityPrivacyPreferences(getInitiatorPrincipalId(identityManagementPersonDocument), identityManagementPersonDocument.getPrincipalId()) ) {
1292 List<EntityAddressBo> entityAddresses = new ArrayList<EntityAddressBo>();
1293 if(CollectionUtils.isNotEmpty(identityManagementPersonDocument.getAddrs())){
1294 for (PersonDocumentAddress address : identityManagementPersonDocument.getAddrs()) {
1295 EntityAddressBo entityAddress = new EntityAddressBo();
1296 entityAddress.setEntityId(identityManagementPersonDocument.getEntityId());
1297 entityAddress.setEntityTypeCode(entityType.getEntityTypeCode());
1298 entityAddress.setAddressTypeCode(address.getAddressTypeCode());
1299 if (address.getAddressType() != null) {
1300 entityAddress.setAddressType(address.getAddressType());
1301 } else {
1302 if (StringUtils.isNotEmpty(address.getAddressTypeCode())) {
1303 entityAddress.setAddressType(EntityAddressTypeBo.from(
1304 getIdentityService().getAddressType(address.getAddressTypeCode())));
1305 }
1306 }
1307 entityAddress.setLine1(address.getLine1());
1308 entityAddress.setLine2(address.getLine2());
1309 entityAddress.setLine3(address.getLine3());
1310 entityAddress.setStateProvinceCode(address.getStateProvinceCode());
1311 entityAddress.setPostalCode(address.getPostalCode());
1312 entityAddress.setCountryCode(address.getCountryCode());
1313 entityAddress.setCity(address.getCity());
1314 entityAddress.setActive(address.isActive());
1315 entityAddress.setDefaultValue(address.isDflt());
1316 entityAddress.setId(address.getEntityAddressId());
1317 if(ObjectUtils.isNotNull(origAddresses)){
1318 for (EntityAddressContract origAddress : origAddresses) {
1319 if (origAddress.getId()!=null && StringUtils.equals(origAddress.getId(), entityAddress.getId())) {
1320 entityAddress.setVersionNumber(origAddress.getVersionNumber());
1321 }
1322 }
1323 }
1324 entityAddresses.add(entityAddress);
1325 }
1326 }
1327 entityType.setAddresses(entityAddresses);
1328 }
1329 }
1330
1331 protected List<PersonDocumentAddress> loadAddresses(IdentityManagementPersonDocument identityManagementPersonDocument, String principalId, List<EntityAddress> entityAddresses, boolean suppressDisplay ) {
1332 List<PersonDocumentAddress> docAddresses = new ArrayList<PersonDocumentAddress>();
1333 if(ObjectUtils.isNotNull(entityAddresses)){
1334 for (EntityAddress address: entityAddresses) {
1335 if(address.isActive()){
1336 PersonDocumentAddress docAddress = new PersonDocumentAddress();
1337 docAddress.setEntityTypeCode(address.getEntityTypeCode());
1338 docAddress.setAddressTypeCode(address.getAddressType().getCode());
1339
1340 //We do not need to check the privacy setting here - The UI should care of it
1341 docAddress.setLine1(address.getLine1Unmasked());
1342 docAddress.setLine2(address.getLine2Unmasked());
1343 docAddress.setLine3(address.getLine3Unmasked());
1344 docAddress.setStateProvinceCode(address.getStateProvinceCodeUnmasked());
1345 docAddress.setPostalCode(address.getPostalCodeUnmasked());
1346 docAddress.setCountryCode(address.getCountryCodeUnmasked());
1347 docAddress.setCity(address.getCityUnmasked());
1348
1349 docAddress.setActive(address.isActive());
1350 docAddress.setDflt(address.isDefaultValue());
1351 docAddress.setEntityAddressId(address.getId());
1352 docAddress.setEdit(true);
1353 docAddresses.add(docAddress);
1354 }
1355 }
1356 }
1357 return docAddresses;
1358 }
1359
1360
1361 protected List <GroupMemberBo> populateGroupMembers(IdentityManagementPersonDocument identityManagementPersonDocument) {
1362 List <GroupMemberBo> groupPrincipals = new ArrayList<GroupMemberBo>();
1363 // List<? extends Group> origGroups = getGroupService().getGroupsByPrincipalId(identityManagementPersonDocument.getPrincipalId());
1364 if(CollectionUtils.isNotEmpty(identityManagementPersonDocument.getGroups())){
1365 for (PersonDocumentGroup group : identityManagementPersonDocument.getGroups()) {
1366 GroupMember.Builder groupPrincipalImpl = GroupMember.Builder.create(group.getGroupId(), identityManagementPersonDocument.getPrincipalId(), KimGroupMemberTypes.PRINCIPAL_MEMBER_TYPE);
1367 if (group.getActiveFromDate() != null) {
1368 groupPrincipalImpl.setActiveFromDate(new DateTime(group.getActiveFromDate().getTime()));
1369 }
1370 if (group.getActiveToDate() != null) {
1371 groupPrincipalImpl.setActiveToDate(new DateTime(group.getActiveToDate().getTime()));
1372 }
1373 groupPrincipalImpl.setId(group.getGroupMemberId());
1374
1375
1376 //groupPrincipalImpl.setVersionNumber(group.getVersionNumber());
1377 // get the ORM-layer optimisic locking value
1378 // TODO: this should be replaced with the retrieval and storage of that value
1379 // in the document tables and not re-retrieved here
1380 Collection<GroupMember> currGroupMembers = getGroupService().getMembers(Collections.singletonList(group.getGroupId()));
1381 if(ObjectUtils.isNotNull(currGroupMembers)){
1382 for (GroupMember origGroupMember: currGroupMembers) {
1383 if (origGroupMember.isActive(new DateTime(System.currentTimeMillis()))
1384 && KimGroupMemberTypes.PRINCIPAL_MEMBER_TYPE.equals(origGroupMember.getType())) {
1385 if(origGroupMember.getId()!=null && StringUtils.equals(origGroupMember.getId(), group.getGroupMemberId())){
1386 groupPrincipalImpl.setObjectId(origGroupMember.getObjectId());
1387 groupPrincipalImpl.setVersionNumber(origGroupMember.getVersionNumber());
1388 }
1389 }
1390 }
1391 }
1392
1393 groupPrincipals.add(GroupMemberBo.from(groupPrincipalImpl.build()));
1394
1395 }
1396 }
1397 return groupPrincipals;
1398 }
1399
1400 protected List<RoleMemberBo> populateRoleMembers(IdentityManagementPersonDocument identityManagementPersonDocument) {
1401 List<RoleBo> origRoles = getRolesForPrincipal(identityManagementPersonDocument.getPrincipalId());
1402
1403 List <RoleMemberBo> roleMembers = new ArrayList<RoleMemberBo>();
1404 if(CollectionUtils.isNotEmpty(identityManagementPersonDocument.getRoles())){
1405 for (PersonDocumentRole role : identityManagementPersonDocument.getRoles()) {
1406 //if(role.isEditable()){
1407 List<RoleMemberBo> origRoleMembers = new ArrayList<RoleMemberBo>();
1408 if(ObjectUtils.isNotNull(origRoles)){
1409 for (RoleBo origRole : origRoles) {
1410 if (origRole.getId()!=null && StringUtils.equals(origRole.getId(), role.getRoleId())) {
1411 origRoleMembers = origRole.getMembers();
1412 break;
1413 }
1414 }
1415 }
1416 if (role.getRolePrncpls().isEmpty()) {
1417 if (!role.getDefinitions().isEmpty()) {
1418 RoleMemberBo roleMemberImpl = new RoleMemberBo();
1419 roleMemberImpl.setRoleId(role.getRoleId());
1420 roleMemberImpl.setMemberId(identityManagementPersonDocument.getPrincipalId());
1421 roleMemberImpl.setType(MemberType.PRINCIPAL);
1422 roleMembers.add(roleMemberImpl);
1423 }
1424 } else {
1425 for (KimDocumentRoleMember roleMember : role.getRolePrncpls()) {
1426 RoleMemberBo roleMemberImpl = new RoleMemberBo();
1427 roleMemberImpl.setRoleId(role.getRoleId());
1428 // TODO : principalId is not ready here yet ?
1429 roleMemberImpl.setMemberId(identityManagementPersonDocument.getPrincipalId());
1430 roleMemberImpl.setType(MemberType.PRINCIPAL);
1431 roleMemberImpl.setId(roleMember.getRoleMemberId());
1432 if (roleMember.getActiveFromDate() != null) {
1433 roleMemberImpl.setActiveFromDateValue(
1434 new java.sql.Timestamp(roleMember.getActiveFromDate().getTime()));
1435 }
1436 if (roleMember.getActiveToDate() != null) {
1437 roleMemberImpl.setActiveToDateValue(
1438 new java.sql.Timestamp(roleMember.getActiveToDate().getTime()));
1439 }
1440 List<RoleMemberAttributeDataBo> origAttributes = new ArrayList<RoleMemberAttributeDataBo>();
1441 if(ObjectUtils.isNotNull(origRoleMembers)){
1442 for (RoleMemberBo origMember : origRoleMembers) {
1443 if (origMember.getId()!=null && StringUtils.equals(origMember.getId(), roleMember.getRoleMemberId())) {
1444 origAttributes = origMember.getAttributeDetails();
1445 roleMemberImpl.setVersionNumber(origMember.getVersionNumber());
1446 }
1447 }
1448 }
1449 List<RoleMemberAttributeDataBo> attributes = new ArrayList<RoleMemberAttributeDataBo>();
1450 if(CollectionUtils.isNotEmpty(roleMember.getQualifiers())){
1451 for (KimDocumentRoleQualifier qualifier : roleMember.getQualifiers()) {
1452 //if (StringUtils.isNotBlank(qualifier.getAttrVal())) {
1453 RoleMemberAttributeDataBo attribute = new RoleMemberAttributeDataBo();
1454 attribute.setId(qualifier.getAttrDataId());
1455 attribute.setAttributeValue(qualifier.getAttrVal());
1456 attribute.setKimAttributeId(qualifier.getKimAttrDefnId());
1457 attribute.setAssignedToId(qualifier.getRoleMemberId());
1458 attribute.setKimTypeId(qualifier.getKimTypId());
1459
1460 updateAttrValIfNecessary(attribute);
1461
1462 if(ObjectUtils.isNotNull(origAttributes)){
1463 for (RoleMemberAttributeDataBo origAttribute : origAttributes) {
1464 if (origAttribute.getId()!=null && StringUtils.equals(origAttribute.getId(), qualifier.getAttrDataId())) {
1465 attribute.setVersionNumber(origAttribute.getVersionNumber());
1466 }
1467 }
1468 }
1469 if (attribute.getVersionNumber() != null || StringUtils.isNotBlank(qualifier.getAttrVal())) {
1470 attributes.add(attribute);
1471 }
1472 //}
1473 }
1474 }
1475 roleMemberImpl.setAttributeDetails(attributes);
1476 roleMembers.add(roleMemberImpl);
1477 }
1478 }
1479 //}
1480 }
1481 }
1482 return roleMembers;
1483 }
1484
1485 protected List<DelegateTypeBo> populateDelegations(IdentityManagementPersonDocument identityManagementPersonDocument){
1486 List<DelegateTypeBo> origDelegations = getPersonDelegations(identityManagementPersonDocument.getPrincipalId());
1487 List<DelegateTypeBo> kimDelegations = new ArrayList<DelegateTypeBo>();
1488 DelegateTypeBo newKimDelegation;
1489 DelegateTypeBo origDelegationImplTemp = null;
1490 List<DelegateMemberBo> origMembers;
1491 boolean activatingInactive = false;
1492 String newDelegationIdAssigned = "";
1493 if(CollectionUtils.isNotEmpty(identityManagementPersonDocument.getDelegations())){
1494 for(RoleDocumentDelegation roleDocumentDelegation: identityManagementPersonDocument.getDelegations()){
1495 newKimDelegation = new DelegateTypeBo();
1496 KimCommonUtilsInternal.copyProperties(newKimDelegation, roleDocumentDelegation);
1497 newKimDelegation.setRoleId(roleDocumentDelegation.getRoleId());
1498 if(ObjectUtils.isNotNull(origDelegations)){
1499 for(DelegateTypeBo origDelegationImpl: origDelegations){
1500 if((origDelegationImpl.getRoleId()!=null && StringUtils.equals(origDelegationImpl.getRoleId(), newKimDelegation.getRoleId())) &&
1501 (origDelegationImpl.getDelegationId()!=null && StringUtils.equals(origDelegationImpl.getDelegationId(), newKimDelegation.getDelegationId()))){
1502 //TODO: verify if you want to add && newRoleMember.isActive() condition to if...
1503 newDelegationIdAssigned = newKimDelegation.getDelegationId();
1504 newKimDelegation.setDelegationId(origDelegationImpl.getDelegationId());
1505 activatingInactive = true;
1506 }
1507 if(origDelegationImpl.getDelegationId()!=null && StringUtils.equals(origDelegationImpl.getDelegationId(), newKimDelegation.getDelegationId())){
1508 newKimDelegation.setVersionNumber(origDelegationImpl.getVersionNumber());
1509 origDelegationImplTemp = origDelegationImpl;
1510 }
1511 }
1512 }
1513 origMembers = (origDelegationImplTemp==null || origDelegationImplTemp.getMembers()==null)?
1514 new ArrayList<DelegateMemberBo>():origDelegationImplTemp.getMembers();
1515 newKimDelegation.setMembers(getDelegationMembers(roleDocumentDelegation.getMembers(), origMembers, null, activatingInactive, newDelegationIdAssigned));
1516 kimDelegations.add(newKimDelegation);
1517 activatingInactive = false;
1518 }
1519 }
1520 return kimDelegations;
1521 }
1522
1523 protected List <RoleMemberAttributeDataBo> getBlankRoleMemberAttrs(List <RoleMemberBo> rolePrncpls) {
1524
1525 List <RoleMemberAttributeDataBo> blankRoleMemberAttrs = new ArrayList<RoleMemberAttributeDataBo>();
1526 if(ObjectUtils.isNotNull(rolePrncpls)){
1527 for (RoleMemberBo roleMbr : rolePrncpls) {
1528 List <RoleMemberAttributeDataBo> roleMemberAttrs = new ArrayList<RoleMemberAttributeDataBo>();
1529 if (CollectionUtils.isNotEmpty(roleMbr.getAttributeDetails())) {
1530 for (RoleMemberAttributeDataBo attr : roleMbr.getAttributeDetails()) {
1531 if (StringUtils.isBlank(attr.getAttributeValue())) {
1532 roleMemberAttrs.add(attr);
1533 }
1534 }
1535 if (!roleMemberAttrs.isEmpty()) {
1536 roleMbr.getAttributeDetails().removeAll(roleMemberAttrs);
1537 blankRoleMemberAttrs.addAll(roleMemberAttrs);
1538 }
1539
1540 }
1541 }
1542 }
1543
1544 return blankRoleMemberAttrs;
1545
1546 }
1547
1548 protected List <RoleResponsibilityActionBo> populateRoleRspActions(IdentityManagementPersonDocument identityManagementPersonDocument) {
1549 // List<RoleImpl> origRoles = getRolesForPrincipal(identityManagementPersonDocument.getPrincipalId());
1550
1551 List <RoleResponsibilityActionBo> roleRspActions = new ArrayList<RoleResponsibilityActionBo>();
1552 if(CollectionUtils.isNotEmpty(identityManagementPersonDocument.getRoles())){
1553 for (PersonDocumentRole role : identityManagementPersonDocument.getRoles()) {
1554 if(CollectionUtils.isNotEmpty(role.getRolePrncpls())){
1555 for (KimDocumentRoleMember roleMbr : role.getRolePrncpls()) {
1556 if(CollectionUtils.isNotEmpty(roleMbr.getRoleRspActions())){
1557 for (KimDocumentRoleResponsibilityAction roleRspAction : roleMbr.getRoleRspActions()) {
1558 RoleResponsibilityActionBo entRoleRspAction = new RoleResponsibilityActionBo();
1559 entRoleRspAction.setId(roleRspAction.getRoleResponsibilityActionId());
1560 entRoleRspAction.setActionPolicyCode(roleRspAction.getActionPolicyCode());
1561 entRoleRspAction.setActionTypeCode(roleRspAction.getActionTypeCode());
1562 entRoleRspAction.setPriorityNumber(roleRspAction.getPriorityNumber());
1563 entRoleRspAction.setRoleMemberId(roleRspAction.getRoleMemberId());
1564 entRoleRspAction.setRoleResponsibilityId(roleRspAction.getRoleResponsibilityId());
1565 List<RoleResponsibilityActionBo> actions = getRoleRspActions( roleMbr.getRoleMemberId());
1566 if(ObjectUtils.isNotNull(actions)){
1567 for(RoleResponsibilityActionBo orgRspAction : actions) {
1568 if (orgRspAction.getId()!=null && StringUtils.equals(orgRspAction.getId(), roleRspAction.getRoleResponsibilityActionId())) {
1569 entRoleRspAction.setVersionNumber(orgRspAction.getVersionNumber());
1570 }
1571 }
1572 }
1573 roleRspActions.add(entRoleRspAction);
1574 }
1575 }
1576 }
1577 }
1578 }
1579 }
1580 return roleRspActions;
1581
1582 }
1583
1584 protected BusinessObjectService getBusinessObjectService() {
1585 if ( businessObjectService == null ) {
1586 businessObjectService = KRADServiceLocator.getBusinessObjectService();
1587 }
1588 return businessObjectService;
1589 }
1590
1591 protected IdentityService getIdentityService() {
1592 if ( identityService == null ) {
1593 identityService = KimApiServiceLocator.getIdentityService();
1594 }
1595 return identityService;
1596 }
1597
1598 protected GroupService getGroupService() {
1599 if ( groupService == null ) {
1600 groupService = KimApiServiceLocator.getGroupService();
1601 }
1602 return groupService;
1603 }
1604
1605 protected DocumentHelperService getDocumentHelperService() {
1606 if ( documentHelperService == null ) {
1607 documentHelperService = KNSServiceLocator.getDocumentHelperService();
1608 }
1609 return this.documentHelperService;
1610 }
1611
1612 protected RoleService getRoleService() {
1613 if(roleService == null){
1614 roleService = KimApiServiceLocator.getRoleService();
1615 }
1616 return roleService;
1617 }
1618
1619 public void setRoleService(RoleService roleService) {
1620 this.roleService = roleService;
1621 }
1622
1623 protected ResponsibilityService getResponsibilityService() {
1624 if ( responsibilityService == null ) {
1625 responsibilityService = KimApiServiceLocator.getResponsibilityService();
1626 }
1627 return responsibilityService;
1628 }
1629
1630 public void setResponsibilityService(ResponsibilityService responsibilityService) {
1631 this.responsibilityService = responsibilityService;
1632 }
1633
1634
1635 /* Role document methods */
1636 @SuppressWarnings("unchecked")
1637 public void loadRoleDoc(IdentityManagementRoleDocument identityManagementRoleDocument, Role role){
1638 Map<String, String> criteria = new HashMap<String, String>();
1639 criteria.put(KimConstants.PrimaryKeyConstants.ROLE_ID, role.getId());
1640 RoleBo roleBo = getBusinessObjectService().findByPrimaryKey(RoleBo.class, criteria);
1641
1642 Map<String, String> subClassCriteria = new HashMap<String, String>();
1643 subClassCriteria.put(KimConstants.PrimaryKeyConstants.SUB_ROLE_ID, role.getId());
1644
1645 identityManagementRoleDocument.setRoleId(roleBo.getId());
1646 identityManagementRoleDocument.setKimType(KimTypeBo.to(roleBo.getKimRoleType()));
1647 identityManagementRoleDocument.setRoleTypeName(roleBo.getKimRoleType().getName());
1648 identityManagementRoleDocument.setRoleTypeId(roleBo.getKimTypeId());
1649 identityManagementRoleDocument.setRoleName(roleBo.getName());
1650 identityManagementRoleDocument.setRoleDescription(roleBo.getDescription());
1651 identityManagementRoleDocument.setActive(roleBo.isActive());
1652 identityManagementRoleDocument.setRoleNamespace(roleBo.getNamespaceCode());
1653 identityManagementRoleDocument.setEditing(true);
1654
1655 identityManagementRoleDocument.setPermissions(loadPermissions(
1656 (List<RolePermissionBo>) getBusinessObjectService().findMatching(RolePermissionBo.class,
1657 subClassCriteria)));
1658 identityManagementRoleDocument.setResponsibilities(loadResponsibilities(
1659 (List<RoleResponsibilityBo>) getBusinessObjectService().findMatching(RoleResponsibilityBo.class,
1660 subClassCriteria)));
1661 loadResponsibilityRoleRspActions(identityManagementRoleDocument);
1662 identityManagementRoleDocument.setMembers(loadRoleMembers(identityManagementRoleDocument, roleBo.getMembers()));
1663 loadMemberRoleRspActions(identityManagementRoleDocument);
1664 identityManagementRoleDocument.setDelegations(loadRoleDocumentDelegations(identityManagementRoleDocument, getRoleDelegations(roleBo.getId())));
1665 //Since delegation members are flattened out on the UI...
1666 setDelegationMembersInDocument(identityManagementRoleDocument);
1667 identityManagementRoleDocument.setKimType(KimTypeBo.to(roleBo.getKimRoleType()));
1668 }
1669
1670 @SuppressWarnings("unchecked")
1671 public void loadRoleMembersBasedOnSearch(IdentityManagementRoleDocument identityManagementRoleDocument,
1672 String memberSearchValue){
1673
1674 List<KimDocumentRoleMember> roleMembersRestricted = new ArrayList<KimDocumentRoleMember>();
1675 List<KimDocumentRoleMember> members = identityManagementRoleDocument.getMembers();
1676 for (KimDocumentRoleMember roleMember : members){
1677 String memberName = roleMember.getMemberName().toLowerCase();
1678 if (memberName.startsWith(memberSearchValue.toLowerCase())) {
1679 roleMembersRestricted.add(roleMember);
1680 }
1681 }
1682
1683 identityManagementRoleDocument.setSearchResultMembers(roleMembersRestricted);
1684 }
1685
1686 @SuppressWarnings("unchecked")
1687 public void clearRestrictedRoleMembersSearchResults(IdentityManagementRoleDocument identityManagementRoleDocument) {
1688 List<KimDocumentRoleMember> roleMembersRestricted = new ArrayList<KimDocumentRoleMember>();
1689 List<KimDocumentRoleMember> members = identityManagementRoleDocument.getMembers();
1690 identityManagementRoleDocument.setSearchResultMembers(roleMembersRestricted);
1691 identityManagementRoleDocument.setMembers(members);
1692 }
1693
1694 public void setDelegationMembersInDocument(IdentityManagementRoleDocument identityManagementRoleDocument){
1695 if(CollectionUtils.isNotEmpty(identityManagementRoleDocument.getDelegations())){
1696 for(RoleDocumentDelegation delegation: identityManagementRoleDocument.getDelegations()){
1697 if(CollectionUtils.isNotEmpty(delegation.getMembers())){
1698 RoleMemberBo roleMember;
1699 for(RoleDocumentDelegationMember member: delegation.getMembers()){
1700 member.setDelegationTypeCode(delegation.getDelegationTypeCode());
1701 if (StringUtils.isEmpty(member.getRoleMemberName())) {
1702 roleMember = getRoleMemberForRoleMemberId(member.getRoleMemberId());
1703 if(roleMember!=null){
1704 member.setRoleMemberName(getMemberName(roleMember.getType(), roleMember.getMemberId()));
1705 member.setRoleMemberNamespaceCode(getMemberNamespaceCode(roleMember.getType(), roleMember.getMemberId()));
1706 }
1707 }
1708 member.setEdit(true);
1709 identityManagementRoleDocument.getDelegationMembers().add(member);
1710 }
1711 }
1712 }
1713 }
1714 }
1715
1716 protected List<KimDocumentRoleResponsibility> loadResponsibilities(List<RoleResponsibilityBo> roleResponsibilities){
1717 List<KimDocumentRoleResponsibility> documentRoleResponsibilities = new ArrayList<KimDocumentRoleResponsibility>();
1718 if(ObjectUtils.isNotNull(roleResponsibilities)){
1719 for(RoleResponsibilityBo roleResponsibility: roleResponsibilities){
1720 if(roleResponsibility.isActive()) {
1721 KimDocumentRoleResponsibility roleResponsibilityCopy = new KimDocumentRoleResponsibility();
1722 KimCommonUtilsInternal.copyProperties(roleResponsibilityCopy, roleResponsibility);
1723 roleResponsibilityCopy.setEdit(true);
1724 documentRoleResponsibilities.add(roleResponsibilityCopy);
1725 }
1726 }
1727 }
1728 return documentRoleResponsibilities;
1729 }
1730
1731 protected List<KimDocumentRolePermission> loadPermissions(List<RolePermissionBo> rolePermissions){
1732 List<KimDocumentRolePermission> documentRolePermissions = new ArrayList<KimDocumentRolePermission>();
1733 KimDocumentRolePermission rolePermissionCopy;
1734 if(ObjectUtils.isNotNull(rolePermissions)){
1735 for(RolePermissionBo rolePermission: rolePermissions){
1736 if ( rolePermission.isActive() ) {
1737 rolePermissionCopy = new KimDocumentRolePermission();
1738 rolePermissionCopy.setRolePermissionId(rolePermission.getId());
1739 rolePermissionCopy.setRoleId(rolePermission.getRoleId());
1740 rolePermissionCopy.setPermissionId(rolePermission.getPermissionId());
1741 rolePermissionCopy.setPermission(PermissionBo.to(rolePermission.getPermission()));
1742 rolePermissionCopy.setEdit(true);
1743 documentRolePermissions.add(rolePermissionCopy);
1744 }
1745 }
1746 }
1747 return documentRolePermissions;
1748 }
1749
1750 public void setMembersInDocument(IdentityManagementRoleDocument identityManagementRoleDocument){
1751 if(CollectionUtils.isNotEmpty(identityManagementRoleDocument.getDelegations())){
1752 Map<String, String> criteria = new HashMap<String, String>();
1753 criteria.put(KimConstants.PrimaryKeyConstants.ROLE_ID, identityManagementRoleDocument.getRoleId());
1754 RoleBo roleBo = getBusinessObjectService().findByPrimaryKey(RoleBo.class, criteria);
1755 List<RoleMemberBo> members = roleBo.getMembers();
1756 List<RoleMemberBo> membersToRemove = new ArrayList<RoleMemberBo>();
1757 boolean found = false;
1758 for(KimDocumentRoleMember modifiedMember : identityManagementRoleDocument.getModifiedMembers() ) {
1759 for(RoleMemberBo member : members) {
1760 if (modifiedMember.getRoleMemberId().equals(member.getId())) {
1761 membersToRemove.add(member);
1762 found = true;
1763 }
1764 if (found) break;
1765 }
1766 }
1767 for(RoleMemberBo memberToRemove : membersToRemove ) {
1768 members.remove(memberToRemove);
1769 }
1770
1771 identityManagementRoleDocument.setMembers(loadRoleMembers(identityManagementRoleDocument, members));
1772 loadMemberRoleRspActions(identityManagementRoleDocument);
1773 }
1774 }
1775
1776 protected List<KimDocumentRoleMember> loadRoleMembers(
1777 IdentityManagementRoleDocument identityManagementRoleDocument, List<RoleMemberBo> members){
1778 List<KimDocumentRoleMember> pndMembers = new ArrayList<KimDocumentRoleMember>();
1779 KimDocumentRoleMember pndMember;
1780
1781 Map<String, PrincipalBo> principalsForPrincipalIds = new HashMap<String, PrincipalBo>();
1782 Map<String, EntityName> entityNamesForPrincipals = new HashMap<String,EntityName>();
1783 Map<String, String> principalIdEntityIdMap = new HashMap<String,String>();
1784 List<String> roleMemberPrincipalIds = new ArrayList<String>();
1785
1786 if(ObjectUtils.isNotNull(members)){
1787 for(RoleMemberBo roleMember : members) {
1788 if (roleMember.getType().getCode().equals(KimConstants.KimGroupMemberTypes.PRINCIPAL_MEMBER_TYPE.getCode())) {
1789 if ((!roleMemberPrincipalIds.contains(roleMember.getMemberId())) && roleMember.isActive()) {
1790 roleMemberPrincipalIds.add(roleMember.getMemberId());
1791 }
1792 }
1793 }
1794
1795 Collection<PrincipalBo> principals = findPrincipalsByPrincipalIds(roleMemberPrincipalIds);
1796 if (principals != null) {
1797 for(PrincipalBo principal : principals) {
1798 principalsForPrincipalIds.put(principal.getPrincipalId(), principal);
1799 principalIdEntityIdMap.put(principal.getPrincipalId(), principal.getEntityId());
1800 }
1801 entityNamesForPrincipals = getUiDocumentServiceDAO().findEntityNamesForRole(
1802 identityManagementRoleDocument.getRoleId());
1803 }
1804
1805 Map<String, Group> roleGroupMembers = getUiDocumentServiceDAO().findGroupsForRole(identityManagementRoleDocument.getRoleId());
1806
1807 for(RoleMemberBo member: members){
1808 pndMember = new KimDocumentRoleMember();
1809 pndMember.setActiveFromDate(member.getActiveFromDateValue());
1810 pndMember.setActiveToDate(member.getActiveToDateValue());
1811 pndMember.setActive(member.isActive(new Timestamp(System.currentTimeMillis())));
1812 if(pndMember.isActive()){
1813 pndMember.setRoleMemberId(member.getId());
1814 pndMember.setRoleId(member.getRoleId());
1815 pndMember.setMemberId(member.getMemberId());
1816 pndMember.setMemberNamespaceCode(getMemberNamespaceCode(member.getType(), member.getMemberId()));
1817
1818 PrincipalBo principal = principalsForPrincipalIds.get(member.getMemberId());
1819 Group group = null;
1820
1821 if (principal != null) {
1822 pndMember.setMemberName(principal.getPrincipalName());
1823 } else {
1824 group = roleGroupMembers.get(member.getMemberId());
1825 if (group != null) {
1826 pndMember.setMemberName(group.getName());
1827 pndMember.setMemberNamespaceCode(group.getNamespaceCode());
1828 } else {
1829 pndMember.setMemberName(getMemberName(member.getType(), member.getMemberId()));
1830 }
1831 }
1832
1833 EntityName entityName = entityNamesForPrincipals.get(principalIdEntityIdMap.get(member.getMemberId()));
1834 if (entityName != null) {
1835 pndMember.setMemberFullName(entityName.getFirstName() + " " + entityName.getLastName());
1836 } else {
1837 if (group != null) {
1838 pndMember.setMemberFullName(group.getName());
1839 } else {
1840 pndMember.setMemberFullName(getMemberFullName(member.getType(), member.getMemberId()));
1841 }
1842 }
1843 pndMember.setMemberTypeCode(member.getType().getCode());
1844 pndMember.setQualifiers(loadRoleMemberQualifiers(identityManagementRoleDocument, member.getAttributeDetails()));
1845 pndMember.setEdit(true);
1846 pndMembers.add(pndMember);
1847 }
1848 }
1849 }
1850 Collections.sort(pndMembers, identityManagementRoleDocument.getMemberMetaDataType());
1851 return pndMembers;
1852 }
1853
1854 public Collection<PrincipalBo> findPrincipalsByPrincipalIds(Collection<String> principalIds) {
1855 if (!principalIds.isEmpty()) {
1856 Map<String,Collection> prncplNameSearchCrit = new HashMap<String,Collection>();
1857 prncplNameSearchCrit.put("PRNCPL_ID", principalIds);
1858 return getBusinessObjectService().findMatching(PrincipalBo.class, prncplNameSearchCrit);
1859 } else {
1860 return null;
1861 }
1862 }
1863
1864 protected void loadResponsibilityRoleRspActions(IdentityManagementRoleDocument identityManagementRoleDocument){
1865 if(CollectionUtils.isNotEmpty(identityManagementRoleDocument.getResponsibilities())){
1866 for(KimDocumentRoleResponsibility responsibility: identityManagementRoleDocument.getResponsibilities()){
1867 responsibility.getRoleRspActions().addAll(loadKimDocumentRoleRespActions(
1868 getRoleResponsibilityActionImpls(responsibility.getRoleResponsibilityId())));
1869 }
1870 }
1871 }
1872
1873 @SuppressWarnings("unchecked")
1874 protected RoleResponsibilityActionBo getRoleResponsibilityActionImpl(String roleResponsibilityActionId){
1875 Map<String, String> criteria = new HashMap<String, String>();
1876 criteria.put(KimConstants.PrimaryKeyConstants.ID, roleResponsibilityActionId);
1877 return getBusinessObjectService().findByPrimaryKey(RoleResponsibilityActionBo.class, criteria);
1878 }
1879
1880 @SuppressWarnings("unchecked")
1881 protected List<RoleResponsibilityActionBo> getRoleResponsibilityActionImpls(String roleResponsibilityId){
1882 Map<String, String> criteria = new HashMap<String, String>();
1883 criteria.put(KimConstants.PrimaryKeyConstants.ROLE_MEMBER_ID, "*");
1884 criteria.put(KimConstants.PrimaryKeyConstants.ROLE_RESPONSIBILITY_ID, roleResponsibilityId);
1885 return (List<RoleResponsibilityActionBo>)
1886 getBusinessObjectService().findMatching(RoleResponsibilityActionBo.class, criteria);
1887 }
1888
1889 @SuppressWarnings("unchecked")
1890 public List<RoleResponsibilityActionBo> getRoleMemberResponsibilityActionImpls(String roleMemberId){
1891 Map<String, String> criteria = new HashMap<String, String>(1);
1892 criteria.put(KimConstants.PrimaryKeyConstants.ROLE_MEMBER_ID, roleMemberId);
1893 return (List<RoleResponsibilityActionBo>)
1894 getBusinessObjectService().findMatching(RoleResponsibilityActionBo.class, criteria);
1895 }
1896
1897 protected void loadMemberRoleRspActions(IdentityManagementRoleDocument identityManagementRoleDocument){
1898 if(CollectionUtils.isNotEmpty(identityManagementRoleDocument.getMembers())){
1899 for(KimDocumentRoleMember member: identityManagementRoleDocument.getMembers()){
1900 member.getRoleRspActions().addAll(loadKimDocumentRoleRespActions(
1901 getRoleMemberResponsibilityActionImpls(member.getRoleMemberId()) ) );
1902 }
1903 }
1904 }
1905
1906 protected List<KimDocumentRoleResponsibilityAction> loadKimDocumentRoleRespActions(
1907 List<RoleResponsibilityActionBo> roleRespActionImpls){
1908 List<KimDocumentRoleResponsibilityAction> documentRoleRespActions = new ArrayList<KimDocumentRoleResponsibilityAction>();
1909 KimDocumentRoleResponsibilityAction documentRoleRespAction;
1910 if(ObjectUtils.isNotNull(roleRespActionImpls)){
1911 for(RoleResponsibilityActionBo roleRespActionImpl: roleRespActionImpls){
1912 documentRoleRespAction = new KimDocumentRoleResponsibilityAction();
1913 KimCommonUtilsInternal.copyProperties(documentRoleRespAction, roleRespActionImpl);
1914
1915 //primary key has different name in these objects! we need to make sure to copy it over
1916 documentRoleRespAction.setRoleResponsibilityActionId(roleRespActionImpl.getId());
1917
1918 // handle the roleResponsibility object being null since not all may be defined when ID value is "*"
1919 if ( ObjectUtils.isNotNull(roleRespActionImpl.getRoleResponsibility()) ) {
1920 documentRoleRespAction.setKimResponsibility(roleRespActionImpl.getRoleResponsibility().getKimResponsibility());
1921 }
1922 documentRoleRespActions.add(documentRoleRespAction);
1923 }
1924 }
1925 return documentRoleRespActions;
1926 }
1927
1928 public BusinessObject getMember(MemberType memberType, String memberId){
1929 Class<? extends BusinessObject> roleMemberTypeClass = null;
1930 String roleMemberIdName = "";
1931 if(MemberType.PRINCIPAL.equals(memberType)) {
1932 roleMemberTypeClass = PrincipalBo.class;
1933 roleMemberIdName = KimConstants.PrimaryKeyConstants.PRINCIPAL_ID;
1934 } else if(MemberType.GROUP.equals(memberType)){
1935 roleMemberTypeClass = GroupBo.class;
1936 roleMemberIdName = KimConstants.PrimaryKeyConstants.GROUP_ID;
1937 } else if(MemberType.ROLE.equals(memberType)){
1938 roleMemberTypeClass = RoleBo.class;
1939 roleMemberIdName = KimConstants.PrimaryKeyConstants.ROLE_ID;
1940 }
1941 Map<String, String> criteria = new HashMap<String, String>();
1942 criteria.put(roleMemberIdName, memberId);
1943 return getBusinessObjectService().findByPrimaryKey(roleMemberTypeClass, criteria);
1944 }
1945
1946 public String getMemberName(MemberType memberType, String memberId){
1947 if (memberType == null || StringUtils.isEmpty(memberId)) { return "";}
1948 BusinessObject member = getMember(memberType, memberId);
1949 if (member == null) { //not a REAL principal, try to fake the name
1950 String fakeName = "";
1951 Principal kp = KimApiServiceLocator.getIdentityService().getPrincipal(memberId);
1952 if(kp != null && kp.getPrincipalName() != null && !"".equals(kp.getPrincipalName())){
1953 fakeName = kp.getPrincipalName();
1954 }
1955
1956 return fakeName;
1957 }
1958 return getMemberName(memberType, member);
1959 }
1960
1961 public String getMemberFullName(MemberType memberType, String memberId){
1962 if(memberType == null || StringUtils.isEmpty(memberId)) {return "";}
1963 String memberFullName = "";
1964 if(MemberType.PRINCIPAL.equals(memberType)){
1965 Principal principalInfo = null;
1966 principalInfo = getIdentityService().getPrincipal(memberId);
1967 if (principalInfo != null) {
1968 String principalName = principalInfo.getPrincipalName();
1969 Person psn = KimApiServiceLocator.getPersonService().getPersonByPrincipalName(principalName);
1970 if (psn != null) {
1971 memberFullName = psn.getFirstName() + " " + psn.getLastName();
1972 }
1973 }
1974 } else if(MemberType.GROUP.equals(memberType)){
1975 Group group = null;
1976 group = getGroupService().getGroup(memberId);
1977 if (group != null) {
1978 memberFullName = group.getName();
1979 }
1980
1981 } else if(MemberType.ROLE.equals(memberType)){
1982 Role role = getRoleService().getRole(memberId);
1983 memberFullName = role.getName();
1984 }
1985 return memberFullName;
1986 }
1987
1988 public String getMemberNamespaceCode(MemberType memberType, String memberId){
1989 if(memberType == null || StringUtils.isEmpty(memberId)) {return "";}
1990 String roleMemberNamespaceCode = "";
1991 if(MemberType.PRINCIPAL.equals(memberType)){
1992 roleMemberNamespaceCode = "";
1993 } else if(MemberType.GROUP.equals(memberType)){
1994 Group groupInfo = getGroupService().getGroup(memberId);
1995 if (groupInfo!= null) {
1996 roleMemberNamespaceCode = groupInfo.getNamespaceCode();
1997 }
1998 } else if(MemberType.ROLE.equals(memberType)){
1999 Role role = getRoleService().getRole(memberId);
2000 if (role != null) {
2001 roleMemberNamespaceCode = role.getNamespaceCode();
2002 }
2003 }
2004 return roleMemberNamespaceCode;
2005 }
2006
2007 public String getMemberIdByName(MemberType memberType, String memberNamespaceCode, String memberName){
2008 String memberId = "";
2009 if(MemberType.PRINCIPAL.equals(memberType)){
2010 Principal principal = getIdentityService().getPrincipalByPrincipalName(memberName);
2011 if(principal!=null) {
2012 memberId = principal.getPrincipalId();
2013 }
2014
2015 } else if(MemberType.GROUP.equals(memberType)){
2016 Group groupInfo = getGroupService().getGroupByNamespaceCodeAndName(memberNamespaceCode, memberName);
2017 if (groupInfo!=null) {
2018 memberId = groupInfo.getId();
2019 }
2020
2021 } else if(MemberType.ROLE.equals(memberType)){
2022 memberId = getRoleService().getRoleIdByNamespaceCodeAndName(memberNamespaceCode, memberName);
2023 }
2024 return memberId;
2025 }
2026
2027 public String getMemberName(MemberType memberType, BusinessObject member){
2028 String roleMemberName = "";
2029 if(MemberType.PRINCIPAL.equals(memberType)){
2030 roleMemberName = ((PrincipalBo)member).getPrincipalName();
2031 } else if(MemberType.GROUP.equals(memberType)){
2032 roleMemberName = ((GroupBo)member).getName();
2033 } else if(MemberType.ROLE.equals(memberType)){
2034 roleMemberName = ((RoleBo)member).getName();
2035 }
2036 return roleMemberName;
2037 }
2038
2039 public String getMemberNamespaceCode(MemberType memberType, BusinessObject member){
2040 String roleMemberNamespaceCode = "";
2041 if(MemberType.PRINCIPAL.equals(memberType)){
2042 roleMemberNamespaceCode = "";
2043 } else if(MemberType.GROUP.equals(memberType)){
2044 roleMemberNamespaceCode = ((GroupBo)member).getNamespaceCode();
2045 } else if(MemberType.ROLE.equals(memberType)){
2046 roleMemberNamespaceCode = ((RoleBo)member).getNamespaceCode();
2047 }
2048 return roleMemberNamespaceCode;
2049 }
2050
2051 protected List<KimDocumentRoleQualifier> loadRoleMemberQualifiers(IdentityManagementRoleDocument identityManagementRoleDocument,
2052 List<RoleMemberAttributeDataBo> attributeDataList){
2053 List<KimDocumentRoleQualifier> pndMemberRoleQualifiers = new ArrayList<KimDocumentRoleQualifier>();
2054 KimDocumentRoleQualifier pndMemberRoleQualifier;
2055
2056 // add all attributes from attributeDataList
2057 if(attributeDataList!=null){
2058 for(RoleMemberAttributeDataBo memberRoleQualifier: attributeDataList){
2059 pndMemberRoleQualifier = new KimDocumentRoleQualifier();
2060 pndMemberRoleQualifier.setAttrDataId(memberRoleQualifier.getId());
2061 pndMemberRoleQualifier.setAttrVal(memberRoleQualifier.getAttributeValue());
2062 pndMemberRoleQualifier.setRoleMemberId(memberRoleQualifier.getAssignedToId());
2063 pndMemberRoleQualifier.setKimTypId(memberRoleQualifier.getKimTypeId());
2064 pndMemberRoleQualifier.setKimAttrDefnId(memberRoleQualifier.getKimAttributeId());
2065 pndMemberRoleQualifier.setKimAttribute(memberRoleQualifier.getKimAttribute());
2066 formatAttrValIfNecessary(pndMemberRoleQualifier);
2067 pndMemberRoleQualifiers.add(pndMemberRoleQualifier);
2068 }
2069 }
2070 // also add any attributes already in the document that are not in the attributeDataList
2071 int countOfOriginalAttributesNotPresent = 0;
2072 List<KimDocumentRoleQualifier> fillerRoleQualifiers = new ArrayList<KimDocumentRoleQualifier>();
2073
2074 List<KimAttributeField> origAttributes = identityManagementRoleDocument.getDefinitions();
2075 if ( origAttributes != null ) {
2076 for(KimAttributeField key: origAttributes) {
2077 boolean attributePresent = false;
2078 String origAttributeId = identityManagementRoleDocument.getKimAttributeDefnId(key);
2079 if(attributeDataList!=null){
2080 for(RoleMemberAttributeDataBo memberRoleQualifier: attributeDataList){
2081 if(origAttributeId!=null && StringUtils.equals(origAttributeId, memberRoleQualifier.getKimAttribute().getId())){
2082 attributePresent = true;
2083 break;
2084 }
2085 }
2086 }
2087 if(!attributePresent){
2088 countOfOriginalAttributesNotPresent++;
2089 pndMemberRoleQualifier = new KimDocumentRoleQualifier();
2090 pndMemberRoleQualifier.setKimAttrDefnId(origAttributeId);
2091 pndMemberRoleQualifier.refreshReferenceObject("kimAttribute");
2092 fillerRoleQualifiers.add(pndMemberRoleQualifier);
2093 }
2094 }
2095
2096 if(countOfOriginalAttributesNotPresent != origAttributes.size()) {
2097 pndMemberRoleQualifiers.addAll(fillerRoleQualifiers);
2098 }
2099 }
2100 return pndMemberRoleQualifiers;
2101 }
2102
2103 @SuppressWarnings("unchecked")
2104 public List<DelegateTypeBo> getRoleDelegations(String roleId){
2105 if(roleId==null) {
2106 return new ArrayList<DelegateTypeBo>();
2107 }
2108 Map<String,String> criteria = new HashMap<String,String>(1);
2109 criteria.put("roleId", roleId);
2110 return (List<DelegateTypeBo>)getBusinessObjectService().findMatching(DelegateTypeBo.class, criteria);
2111 }
2112
2113 protected List<RoleDocumentDelegation> loadRoleDocumentDelegations(IdentityManagementRoleDocument identityManagementRoleDocument, List<DelegateTypeBo> delegations){
2114 List<RoleDocumentDelegation> delList = new ArrayList<RoleDocumentDelegation>();
2115 RoleDocumentDelegation documentDelegation;
2116 if(ObjectUtils.isNotNull(delegations)){
2117 for(DelegateTypeBo del: delegations){
2118 documentDelegation = new RoleDocumentDelegation();
2119 documentDelegation.setActive(del.isActive());
2120 if(documentDelegation.isActive()){
2121 documentDelegation.setDelegationId(del.getDelegationId());
2122 documentDelegation.setDelegationTypeCode(del.getDelegationTypeCode());
2123 documentDelegation.setKimTypeId(del.getKimTypeId());
2124 documentDelegation.setMembers(loadDelegationMembers(identityManagementRoleDocument, del.getMembers()));
2125 documentDelegation.setRoleId(del.getRoleId());
2126 documentDelegation.setEdit(true);
2127 delList.add(documentDelegation);
2128 }
2129 }
2130 }
2131 return delList;
2132 }
2133
2134 protected List<RoleDocumentDelegationMember> loadDelegationMembers(IdentityManagementRoleDocument identityManagementRoleDocument, List<DelegateMemberBo> members){
2135 List<RoleDocumentDelegationMember> pndMembers = new ArrayList<RoleDocumentDelegationMember>();
2136 RoleDocumentDelegationMember pndMember;
2137 RoleMemberBo roleMember;
2138 if(ObjectUtils.isNotNull(members)){
2139 for(DelegateMemberBo member: members){
2140 pndMember = new RoleDocumentDelegationMember();
2141 pndMember.setActiveFromDate(member.getActiveFromDateValue());
2142 pndMember.setActiveToDate(member.getActiveToDateValue());
2143 pndMember.setActive(member.isActive(new Timestamp(System.currentTimeMillis())));
2144 if(pndMember.isActive()){
2145 //KimCommonUtilsInternal.copyProperties(pndMember, member);
2146 pndMember.setDelegationId(member.getDelegationId());
2147 pndMember.setDelegationMemberId(member.getDelegationMemberId());
2148 pndMember.setDelegationTypeCode(member.getType().getCode());
2149 pndMember.setRoleMemberId(member.getRoleMemberId());
2150 pndMember.setMemberId(member.getMemberId());
2151 pndMember.setMemberTypeCode(member.getType().getCode());
2152
2153 roleMember = getRoleMemberForRoleMemberId(member.getRoleMemberId());
2154 if(roleMember!=null){
2155 pndMember.setRoleMemberName(getMemberName(roleMember.getType(), roleMember.getMemberId()));
2156 pndMember.setRoleMemberNamespaceCode(getMemberNamespaceCode(roleMember.getType(), roleMember.getMemberId()));
2157 }
2158 pndMember.setMemberNamespaceCode(getMemberNamespaceCode(member.getType(), member.getMemberId()));
2159 pndMember.setMemberName(getMemberName(member.getType(), member.getMemberId()));
2160 pndMember.setEdit(true);
2161 pndMember.setQualifiers(loadDelegationMemberQualifiers(identityManagementRoleDocument, member.getAttributeDetails()));
2162 pndMembers.add(pndMember);
2163 }
2164 }
2165 }
2166 return pndMembers;
2167 }
2168
2169 protected RoleMemberBo getRoleMemberForRoleMemberId(String roleMemberId){
2170 Map<String,String> criteria = new HashMap<String,String>( 2 );
2171 criteria.put(KimConstants.PrimaryKeyConstants.ID, roleMemberId);
2172 return getBusinessObjectService().findByPrimaryKey(RoleMemberBo.class, criteria);
2173 }
2174
2175 protected List<RoleDocumentDelegationMemberQualifier> loadDelegationMemberQualifiers(IdentityManagementRoleDocument identityManagementRoleDocument,
2176 List<DelegateMemberAttributeDataBo> attributeDataList){
2177 List<RoleDocumentDelegationMemberQualifier> pndMemberRoleQualifiers = new ArrayList<RoleDocumentDelegationMemberQualifier>();
2178 RoleDocumentDelegationMemberQualifier pndMemberRoleQualifier;
2179 List<KimAttributeField> origAttributes = identityManagementRoleDocument.getDefinitions();
2180 boolean attributePresent = false;
2181 String origAttributeId;
2182 if(origAttributes!=null){
2183 for(KimAttributeField key: origAttributes) {
2184 origAttributeId = identityManagementRoleDocument.getKimAttributeDefnId(key);
2185 if(attributeDataList!=null){
2186 for(DelegateMemberAttributeDataBo memberRoleQualifier: attributeDataList){
2187 if(origAttributeId!=null && StringUtils.equals(origAttributeId, memberRoleQualifier.getKimAttribute().getId())){
2188 pndMemberRoleQualifier = new RoleDocumentDelegationMemberQualifier();
2189 pndMemberRoleQualifier.setAttrDataId(memberRoleQualifier.getId());
2190 pndMemberRoleQualifier.setAttrVal(memberRoleQualifier.getAttributeValue());
2191 pndMemberRoleQualifier.setDelegationMemberId(memberRoleQualifier.getAssignedToId());
2192 pndMemberRoleQualifier.setKimTypId(memberRoleQualifier.getKimTypeId());
2193 pndMemberRoleQualifier.setKimAttrDefnId(memberRoleQualifier.getKimAttributeId());
2194 pndMemberRoleQualifier.setKimAttribute(memberRoleQualifier.getKimAttribute());
2195 pndMemberRoleQualifiers.add(pndMemberRoleQualifier);
2196 attributePresent = true;
2197 }
2198 }
2199 }
2200 if(!attributePresent){
2201 pndMemberRoleQualifier = new RoleDocumentDelegationMemberQualifier();
2202 pndMemberRoleQualifier.setKimAttrDefnId(origAttributeId);
2203 pndMemberRoleQualifier.refreshReferenceObject("kimAttribute");
2204 pndMemberRoleQualifiers.add(pndMemberRoleQualifier);
2205 }
2206 attributePresent = false;
2207 }
2208 }
2209 return pndMemberRoleQualifiers;
2210 }
2211
2212 /**
2213 * @see org.kuali.rice.kim.service.UiDocumentService#saveEntityPerson(IdentityManagementPersonDocument)
2214 */
2215 @SuppressWarnings("unchecked")
2216 public void saveRole(IdentityManagementRoleDocument identityManagementRoleDocument) {
2217 RoleBo roleBo = new RoleBo();
2218 Map<String, String> criteria = new HashMap<String, String>();
2219 String roleId = identityManagementRoleDocument.getRoleId();
2220 criteria.put(KimConstants.PrimaryKeyConstants.ID, roleId);
2221 RoleBo origRole = getBusinessObjectService().findByPrimaryKey(RoleBo.class, criteria);
2222
2223 List<RolePermissionBo> origRolePermissions = new ArrayList<RolePermissionBo>();
2224 List<RoleResponsibilityBo> origRoleResponsibilities = new ArrayList<RoleResponsibilityBo>();
2225 List<RoleMemberBo> origRoleMembers = new ArrayList<RoleMemberBo>();
2226 List<DelegateTypeBo> origRoleDelegations = new ArrayList<DelegateTypeBo>();
2227
2228 roleBo.setId(identityManagementRoleDocument.getRoleId());
2229 roleBo.setKimTypeId(identityManagementRoleDocument.getRoleTypeId());
2230 roleBo.setNamespaceCode(identityManagementRoleDocument.getRoleNamespace());
2231 roleBo.setName(identityManagementRoleDocument.getRoleName());
2232 roleBo.setDescription(identityManagementRoleDocument.getRoleDescription());
2233
2234 if (origRole == null) {
2235 origRole = new RoleBo();
2236 roleBo.setActive(true);
2237 } else {
2238 roleBo.setActive(identityManagementRoleDocument.isActive());
2239 roleBo.setVersionNumber(origRole.getVersionNumber());
2240 Map<String, String> altCriteria = new HashMap<String, String>();
2241 altCriteria.put(KimConstants.PrimaryKeyConstants.SUB_ROLE_ID, roleId);
2242 origRolePermissions = new ArrayList<RolePermissionBo>(getBusinessObjectService().findMatching(RolePermissionBo.class, altCriteria));
2243 origRoleResponsibilities = (List<RoleResponsibilityBo>)getBusinessObjectService().findMatching(RoleResponsibilityBo.class, altCriteria);
2244 origRoleMembers = (List<RoleMemberBo>)getBusinessObjectService().findMatching(RoleMemberBo.class, altCriteria);
2245 origRoleDelegations = (List<DelegateTypeBo>)getBusinessObjectService().findMatching(DelegateTypeBo.class, altCriteria);
2246 }
2247
2248 if( getKimTypeInfoService().getKimType(identityManagementRoleDocument.getRoleTypeId()) == null ) {
2249 LOG.error( "Kim type not found for:"+identityManagementRoleDocument.getRoleTypeId(), new Throwable() );
2250 }
2251
2252 List<PersistableBusinessObject> bos = new ArrayList<PersistableBusinessObject>();
2253
2254 bos.add(roleBo);
2255 bos.addAll(getRolePermissions(identityManagementRoleDocument, origRolePermissions));
2256 bos.addAll(getRoleResponsibilities(identityManagementRoleDocument, origRoleResponsibilities));
2257 bos.addAll(getRoleResponsibilitiesActions(identityManagementRoleDocument));
2258 String initiatorPrincipalId = getInitiatorPrincipalId(identityManagementRoleDocument);
2259
2260 if(canAssignToRole(identityManagementRoleDocument, initiatorPrincipalId)){
2261 List<RoleMemberBo> newRoleMembersList = getRoleMembers(identityManagementRoleDocument, origRoleMembers);
2262 roleBo.setMembers(newRoleMembersList);
2263
2264 bos.addAll(getRoleMemberResponsibilityActions(newRoleMembersList));
2265 //bos.addAll(getRoleMemberResponsibilityActions(identityManagementRoleDocument));
2266 bos.addAll(getRoleDelegations(identityManagementRoleDocument, origRoleDelegations));
2267 }
2268 // bos.add(roleBo);
2269 getBusinessObjectService().save(bos);
2270 KimImplServiceLocator.getResponsibilityInternalService().updateActionRequestsForResponsibilityChange(getChangedRoleResponsibilityIds(identityManagementRoleDocument, origRoleResponsibilities));
2271 if(!roleBo.isActive()){
2272 // when a role is inactivated, inactivate the memberships of principals, groups, and roles in
2273 // that role, delegations, and delegation members, and that roles memberships in other roles
2274 KimImplServiceLocator.getRoleInternalService().roleInactivated(identityManagementRoleDocument.getRoleId());
2275 }
2276 }
2277
2278 protected List<RolePermissionBo> getRolePermissions(
2279 IdentityManagementRoleDocument identityManagementRoleDocument, List<RolePermissionBo> origRolePermissions){
2280 List<RolePermissionBo> rolePermissions = new ArrayList<RolePermissionBo>();
2281 if(CollectionUtils.isNotEmpty(identityManagementRoleDocument.getPermissions())){
2282 for(KimDocumentRolePermission documentRolePermission: identityManagementRoleDocument.getPermissions()){
2283 RolePermissionBo newRolePermission = new RolePermissionBo();
2284 newRolePermission.setId(documentRolePermission.getRolePermissionId());
2285 newRolePermission.setRoleId(identityManagementRoleDocument.getRoleId());
2286 newRolePermission.setPermissionId(documentRolePermission.getPermissionId());
2287 newRolePermission.setActive( documentRolePermission.isActive() );
2288
2289 newRolePermission.setActive(documentRolePermission.isActive());
2290 if (ObjectUtils.isNotNull(origRolePermissions)) {
2291 for (RolePermissionBo origPermissionImpl : origRolePermissions) {
2292 if (!StringUtils.equals(origPermissionImpl.getRoleId(), newRolePermission.getRoleId())
2293 && StringUtils.equals(origPermissionImpl.getPermissionId(), newRolePermission.getPermissionId())
2294 && origPermissionImpl.isActive()
2295 && newRolePermission.isActive()) {
2296 newRolePermission.setId(origPermissionImpl.getId());
2297 }
2298 if(origPermissionImpl.getId()!=null && StringUtils.equals(origPermissionImpl.getId(), newRolePermission.getId())){
2299 newRolePermission.setVersionNumber(origPermissionImpl.getVersionNumber());
2300 newRolePermission.setObjectId(origPermissionImpl.getObjectId());
2301 }
2302 }
2303 }
2304 rolePermissions.add(newRolePermission);
2305 }
2306 }
2307 return rolePermissions;
2308 }
2309
2310 protected List<RoleResponsibilityBo> getRoleResponsibilities(
2311 IdentityManagementRoleDocument identityManagementRoleDocument, List<RoleResponsibilityBo> origRoleResponsibilities){
2312 List<RoleResponsibilityBo> roleResponsibilities = new ArrayList<RoleResponsibilityBo>();
2313 RoleResponsibilityBo newRoleResponsibility;
2314 if(CollectionUtils.isNotEmpty(identityManagementRoleDocument.getResponsibilities())){
2315 for(KimDocumentRoleResponsibility documentRoleResponsibility: identityManagementRoleDocument.getResponsibilities()){
2316 newRoleResponsibility = new RoleResponsibilityBo();
2317 KimCommonUtilsInternal.copyProperties(newRoleResponsibility, documentRoleResponsibility);
2318 newRoleResponsibility.setActive(documentRoleResponsibility.isActive());
2319 newRoleResponsibility.setRoleId(identityManagementRoleDocument.getRoleId());
2320 if(ObjectUtils.isNotNull(origRoleResponsibilities)){
2321 for(RoleResponsibilityBo origResponsibilityImpl: origRoleResponsibilities){
2322 if(!StringUtils.equals(origResponsibilityImpl.getRoleId(), newRoleResponsibility.getRoleId()) &&
2323 StringUtils.equals(origResponsibilityImpl.getResponsibilityId(), newRoleResponsibility.getResponsibilityId()) &&
2324 !origResponsibilityImpl.isActive() && newRoleResponsibility.isActive()){
2325 newRoleResponsibility.setRoleResponsibilityId(origResponsibilityImpl.getRoleResponsibilityId());
2326 }
2327 if(origResponsibilityImpl.getRoleResponsibilityId()!=null && StringUtils.equals(origResponsibilityImpl.getRoleResponsibilityId(), newRoleResponsibility.getRoleResponsibilityId())) {
2328 newRoleResponsibility.setVersionNumber(origResponsibilityImpl.getVersionNumber());
2329 newRoleResponsibility.setObjectId(origResponsibilityImpl.getObjectId());
2330 }
2331 }
2332 }
2333 roleResponsibilities.add(newRoleResponsibility);
2334 }
2335 }
2336 return roleResponsibilities;
2337 }
2338
2339
2340 protected List <RoleResponsibilityActionBo> getRoleResponsibilitiesActions(
2341 IdentityManagementRoleDocument identityManagementRoleDocument){
2342 List <RoleResponsibilityActionBo> roleRspActions = new ArrayList<RoleResponsibilityActionBo>();
2343 if(CollectionUtils.isNotEmpty(identityManagementRoleDocument.getResponsibilities())){
2344 // loop over the responsibilities assigned to the role
2345 for(KimDocumentRoleResponsibility roleResponsibility : identityManagementRoleDocument.getResponsibilities()){
2346 // only process if the actions are not assigned at the role member level
2347 if(!getResponsibilityInternalService().areActionsAtAssignmentLevelById(roleResponsibility.getResponsibilityId())){
2348 List<KimDocumentRoleResponsibilityAction> documentRoleResponsibilityActions = roleResponsibility.getRoleRspActions();
2349 if( ObjectUtils.isNotNull(documentRoleResponsibilityActions)
2350 && !documentRoleResponsibilityActions.isEmpty()
2351 && StringUtils.isNotBlank(documentRoleResponsibilityActions.get(0).getRoleResponsibilityActionId() ) ) {
2352 RoleResponsibilityActionBo roleRspAction = new RoleResponsibilityActionBo();
2353 roleRspAction.setId(documentRoleResponsibilityActions.get(0).getRoleResponsibilityActionId());
2354 roleRspAction.setActionPolicyCode(documentRoleResponsibilityActions.get(0).getActionPolicyCode());
2355 roleRspAction.setActionTypeCode(documentRoleResponsibilityActions.get(0).getActionTypeCode());
2356 roleRspAction.setPriorityNumber(documentRoleResponsibilityActions.get(0).getPriorityNumber());
2357 roleRspAction.setForceAction(documentRoleResponsibilityActions.get(0).isForceAction());
2358 roleRspAction.setRoleMemberId("*");
2359 roleRspAction.setRoleResponsibilityId(documentRoleResponsibilityActions.get(0).getRoleResponsibilityId());
2360 updateResponsibilityActionVersionNumber(roleRspAction, getRoleResponsibilityActionImpl(roleRspAction.getId()));
2361 roleRspActions.add(roleRspAction);
2362 }
2363 }
2364 }
2365 }
2366 return roleRspActions;
2367 }
2368
2369 // FIXME: This should be pulling by the PK, not using another method which pulls multiple records and then finds
2370 // the right one here!
2371 protected void updateResponsibilityActionVersionNumber(RoleResponsibilityActionBo newRoleRspAction,
2372 RoleResponsibilityActionBo origRoleRespActionImpl){
2373 if(ObjectUtils.isNotNull(origRoleRespActionImpl)){
2374 if(origRoleRespActionImpl.getId()!=null && StringUtils.equals(origRoleRespActionImpl.getId(), newRoleRspAction.getId())) {
2375 newRoleRspAction.setVersionNumber(origRoleRespActionImpl.getVersionNumber());
2376 newRoleRspAction.setObjectId(origRoleRespActionImpl.getObjectId());
2377 }
2378 }
2379 }
2380
2381 protected List<RoleResponsibilityActionBo> getRoleMemberResponsibilityActions(List<RoleMemberBo> newRoleMembersList){
2382 List<RoleResponsibilityActionBo> roleRspActions = new ArrayList<RoleResponsibilityActionBo>();
2383 if(ObjectUtils.isNotNull(newRoleMembersList)){
2384 for(RoleMemberBo roleMember: newRoleMembersList){
2385 roleRspActions.addAll(roleMember.getRoleRspActions());
2386 }
2387 }
2388 return roleRspActions;
2389 }
2390
2391 /*protected List<RoleResponsibilityActionBo> getRoleMemberResponsibilityActions(IdentityManagementRoleDocument identityManagementRoleDocument){
2392 List<RoleResponsibilityActionBo> roleRspActions = new ArrayList<RoleResponsibilityActionBo>();
2393 if(CollectionUtils.isNotEmpty(identityManagementRoleDocument.getMembers())){
2394 for(KimDocumentRoleMember roleMember: identityManagementRoleDocument.getMembers()){
2395 for(KimDocumentRoleResponsibilityAction roleRspAction : roleMember.getRoleRspActions()){
2396 RoleResponsibilityActionBo entRoleRspAction = new RoleResponsibilityActionBo();
2397 entRoleRspAction.setId(roleRspAction.getRoleResponsibilityActionId());
2398 entRoleRspAction.setActionPolicyCode(roleRspAction.getActionPolicyCode());
2399 entRoleRspAction.setActionTypeCode(roleRspAction.getActionTypeCode());
2400 entRoleRspAction.setPriorityNumber(roleRspAction.getPriorityNumber());
2401 entRoleRspAction.setRoleMemberId(roleRspAction.getRoleMemberId());
2402 entRoleRspAction.setForceAction(roleRspAction.isForceAction());
2403 entRoleRspAction.setRoleResponsibilityId(roleRspAction.getRoleResponsibilityId());
2404 List<RoleResponsibilityActionBo> actions = getRoleRspActions(roleMember.getRoleMemberId());
2405 if(ObjectUtils.isNotNull(actions)){
2406 for(RoleResponsibilityActionBo orgRspAction : actions) {
2407 if (orgRspAction.getId()!=null && StringUtils.equals(orgRspAction.getId(), roleRspAction.getRoleResponsibilityActionId())) {
2408 entRoleRspAction.setVersionNumber(orgRspAction.getVersionNumber());
2409 }
2410 }
2411 }
2412 roleRspActions.add(entRoleRspAction);
2413 }
2414 }
2415 }
2416 return roleRspActions;
2417 }*/
2418
2419 protected List<RoleMemberBo> getRoleMembers(IdentityManagementRoleDocument identityManagementRoleDocument, List<RoleMemberBo> origRoleMembers){
2420 List<RoleMemberBo> roleMembers = new ArrayList<RoleMemberBo>();
2421 RoleMemberBo newRoleMember;
2422 RoleMemberBo origRoleMemberImplTemp;
2423 List<RoleMemberAttributeDataBo> origAttributes;
2424 boolean activatingInactive = false;
2425 String newRoleMemberIdAssigned = "";
2426
2427 identityManagementRoleDocument.setKimType(KimApiServiceLocator.getKimTypeInfoService().getKimType(identityManagementRoleDocument.getRoleTypeId()));
2428 KimTypeService kimTypeService = KimFrameworkServiceLocator.getKimTypeService(identityManagementRoleDocument.getKimType());
2429
2430 if(CollectionUtils.isNotEmpty(identityManagementRoleDocument.getModifiedMembers())){
2431 for(KimDocumentRoleMember documentRoleMember: identityManagementRoleDocument.getModifiedMembers()){
2432 origRoleMemberImplTemp = null;
2433
2434 newRoleMember = new RoleMemberBo();
2435 KimCommonUtilsInternal.copyProperties(newRoleMember, documentRoleMember);
2436 newRoleMember.setId(documentRoleMember.getRoleMemberId());
2437 newRoleMember.setRoleId(identityManagementRoleDocument.getRoleId());
2438 if(ObjectUtils.isNotNull(origRoleMembers)){
2439 for(RoleMemberBo origRoleMemberImpl: origRoleMembers){
2440 if((origRoleMemberImpl.getRoleId()!=null && StringUtils.equals(origRoleMemberImpl.getRoleId(), newRoleMember.getRoleId())) &&
2441 (origRoleMemberImpl.getMemberId()!=null && StringUtils.equals(origRoleMemberImpl.getMemberId(), newRoleMember.getMemberId())) &&
2442 (origRoleMemberImpl.getType()!=null && org.apache.commons.lang.ObjectUtils.equals(origRoleMemberImpl.getType(), newRoleMember.getType())) &&
2443 !origRoleMemberImpl.isActive() &&
2444 !kimTypeService.validateUniqueAttributes(
2445 identityManagementRoleDocument.getKimType().getId(),
2446 documentRoleMember.getQualifierAsMap(), origRoleMemberImpl.getAttributes()).isEmpty()) {
2447
2448 //TODO: verify if you want to add && newRoleMember.isActive() condition to if...
2449
2450 newRoleMemberIdAssigned = newRoleMember.getId();
2451 newRoleMember.setId(origRoleMemberImpl.getId());
2452 activatingInactive = true;
2453 }
2454 if(origRoleMemberImpl.getId()!=null && StringUtils.equals(origRoleMemberImpl.getId(), newRoleMember.getId())){
2455 newRoleMember.setVersionNumber(origRoleMemberImpl.getVersionNumber());
2456 origRoleMemberImplTemp = origRoleMemberImpl;
2457
2458 // Obtain role rsp actions from db and assign to origRoleMemberImplTemp
2459 List<RoleResponsibilityActionBo> roleRespActionBos = getRoleMemberResponsibilityActionImpls(origRoleMemberImplTemp.getId());
2460 if(ObjectUtils.isNotNull(roleRespActionBos))
2461 origRoleMemberImplTemp.setRoleRspActions(roleRespActionBos);
2462 }
2463 }
2464 }
2465 origAttributes = (origRoleMemberImplTemp==null || origRoleMemberImplTemp.getAttributes()==null)?
2466 new ArrayList<RoleMemberAttributeDataBo>():origRoleMemberImplTemp.getAttributeDetails();
2467 newRoleMember.setActiveFromDateValue(documentRoleMember.getActiveFromDate());
2468 newRoleMember.setActiveToDateValue(documentRoleMember.getActiveToDate());
2469 newRoleMember.setAttributeDetails(getRoleMemberAttributeData(documentRoleMember.getQualifiers(), origAttributes, activatingInactive, newRoleMemberIdAssigned));
2470 newRoleMember.setRoleRspActions(getRoleMemberResponsibilityActions(documentRoleMember, origRoleMemberImplTemp, activatingInactive, newRoleMemberIdAssigned));
2471 newRoleMember.setType(MemberType.fromCode(documentRoleMember.getMemberTypeCode()));
2472
2473 if( (origRoleMemberImplTemp == null) || (!newRoleMember.equals(origRoleMemberImplTemp)) ) {
2474 roleMembers.add(newRoleMember);
2475 }
2476 activatingInactive = false;
2477 origRoleMemberImplTemp = null;
2478 }
2479 }
2480 return roleMembers;
2481 }
2482
2483 protected List<RoleResponsibilityActionBo> getRoleMemberResponsibilityActions(
2484 KimDocumentRoleMember documentRoleMember, RoleMemberBo origRoleMemberImplTemp, boolean activatingInactive, String newRoleMemberIdAssigned){
2485 List<RoleResponsibilityActionBo> roleRspActions = new ArrayList<RoleResponsibilityActionBo>();
2486 List<RoleResponsibilityActionBo> origActions = new ArrayList<RoleResponsibilityActionBo>();
2487 if(origRoleMemberImplTemp!=null) {
2488 origActions = getRoleRspActions(origRoleMemberImplTemp.getId());
2489 }
2490 if(CollectionUtils.isNotEmpty(documentRoleMember.getRoleRspActions())){
2491 for(KimDocumentRoleResponsibilityAction roleRspAction : documentRoleMember.getRoleRspActions()){
2492 RoleResponsibilityActionBo newRoleRspAction = new RoleResponsibilityActionBo();
2493 newRoleRspAction.setId(roleRspAction.getRoleResponsibilityActionId());
2494 newRoleRspAction.setActionPolicyCode(roleRspAction.getActionPolicyCode());
2495 newRoleRspAction.setActionTypeCode(roleRspAction.getActionTypeCode());
2496 newRoleRspAction.setPriorityNumber(roleRspAction.getPriorityNumber());
2497 newRoleRspAction.setRoleMemberId(roleRspAction.getRoleMemberId());
2498 newRoleRspAction.setForceAction(roleRspAction.isForceAction());
2499 newRoleRspAction.setRoleResponsibilityId("*");
2500 if(ObjectUtils.isNotNull(origActions)){
2501 for(RoleResponsibilityActionBo origRspAction: origActions) {
2502 if(activatingInactive && StringUtils.equals(origRspAction.getRoleResponsibilityId(), newRoleRspAction.getRoleResponsibilityId()) &&
2503 StringUtils.equals(newRoleRspAction.getRoleMemberId(), newRoleMemberIdAssigned)){
2504 newRoleRspAction.setRoleMemberId(origRspAction.getRoleMemberId());
2505 newRoleRspAction.setId(origRspAction.getId());
2506 }
2507 if (origRspAction.getId()!=null && StringUtils.equals(origRspAction.getId(), newRoleRspAction.getId())) {
2508 newRoleRspAction.setVersionNumber(origRspAction.getVersionNumber());
2509 newRoleRspAction.setObjectId(origRspAction.getObjectId());
2510
2511 }
2512 }
2513 }
2514 roleRspActions.add(newRoleRspAction);
2515 }
2516 }
2517 return roleRspActions;
2518 }
2519
2520 protected List<RoleMemberAttributeDataBo> getRoleMemberAttributeData(List<KimDocumentRoleQualifier> qualifiers,
2521 List<RoleMemberAttributeDataBo> origAttributes, boolean activatingInactive, String newRoleMemberIdAssigned){
2522 List<RoleMemberAttributeDataBo> roleMemberAttributeDataList = new ArrayList<RoleMemberAttributeDataBo>();
2523 RoleMemberAttributeDataBo newRoleMemberAttributeData;
2524 if(CollectionUtils.isNotEmpty(qualifiers)){
2525 for(KimDocumentRoleQualifier memberRoleQualifier: qualifiers){
2526 if(StringUtils.isNotBlank(memberRoleQualifier.getAttrVal())){
2527 newRoleMemberAttributeData = new RoleMemberAttributeDataBo();
2528 newRoleMemberAttributeData.setId(memberRoleQualifier.getAttrDataId());
2529 newRoleMemberAttributeData.setAttributeValue(memberRoleQualifier.getAttrVal());
2530 newRoleMemberAttributeData.setAssignedToId(memberRoleQualifier.getRoleMemberId());
2531 newRoleMemberAttributeData.setKimTypeId(memberRoleQualifier.getKimTypId());
2532 newRoleMemberAttributeData.setKimAttributeId(memberRoleQualifier.getKimAttrDefnId());
2533
2534 updateAttrValIfNecessary(newRoleMemberAttributeData);
2535
2536 if(ObjectUtils.isNotNull(origAttributes)){
2537 for(RoleMemberAttributeDataBo origAttribute: origAttributes){
2538 if(activatingInactive && StringUtils.equals(origAttribute.getKimAttributeId(), newRoleMemberAttributeData.getKimAttributeId()) &&
2539 StringUtils.equals(newRoleMemberAttributeData.getAssignedToId(), newRoleMemberIdAssigned)){
2540 newRoleMemberAttributeData.setAssignedToId(origAttribute.getAssignedToId());
2541 newRoleMemberAttributeData.setId(origAttribute.getId());
2542 }
2543 if(origAttribute.getId()!=null && StringUtils.equals(origAttribute.getId(), newRoleMemberAttributeData.getId())){
2544 newRoleMemberAttributeData.setVersionNumber(origAttribute.getVersionNumber());
2545 }
2546 }
2547 }
2548 roleMemberAttributeDataList.add(newRoleMemberAttributeData);
2549 }
2550 }
2551 }
2552 return roleMemberAttributeDataList;
2553 }
2554
2555 /**
2556 * Determines if the attribute value on the attribute data should be updated; if so, it performs some attribute value formatting.
2557 * In the default implementation, this method formats checkbox controls
2558 *
2559 * @param roleMemberAttributeData a role member qualifier attribute to update
2560 */
2561 protected void updateAttrValIfNecessary(RoleMemberAttributeDataBo roleMemberAttributeData) {
2562 if (doCheckboxLogic(roleMemberAttributeData.getKimTypeId(), roleMemberAttributeData.getKimAttributeId())) {
2563 convertCheckboxAttributeData(roleMemberAttributeData);
2564 }
2565 }
2566
2567 protected void formatAttrValIfNecessary(KimDocumentRoleQualifier roleQualifier) {
2568 if (doCheckboxLogic(roleQualifier.getKimTypId(), roleQualifier.getKimAttrDefnId())) {
2569 formatCheckboxAttributeData(roleQualifier);
2570 }
2571 }
2572
2573 private boolean doCheckboxLogic(String kimTypeId, String attrId) {
2574 final KimAttributeField attributeDefinition = getAttributeDefinition(kimTypeId, attrId);
2575 return attributeDefinition != null
2576 && attributeDefinition.getAttributeField().getControl() != null
2577 && (attributeDefinition.getAttributeField().getControl() instanceof RemotableCheckboxGroup
2578 || attributeDefinition.getAttributeField().getControl() instanceof RemotableCheckbox);
2579 }
2580
2581 protected void formatCheckboxAttributeData(KimDocumentRoleQualifier roleQualifier) {
2582 if (roleQualifier.getAttrVal().equals(KimConstants.KIM_ATTRIBUTE_BOOLEAN_TRUE_STR_VALUE)) {
2583 roleQualifier.setAttrVal(KimConstants.KIM_ATTRIBUTE_BOOLEAN_TRUE_STR_VALUE_DISPLAY);
2584 } else if (roleQualifier.getAttrVal().equals(KimConstants.KIM_ATTRIBUTE_BOOLEAN_FALSE_STR_VALUE)) {
2585 roleQualifier.setAttrVal(KimConstants.KIM_ATTRIBUTE_BOOLEAN_FALSE_STR_VALUE_DISPLAY);
2586 }
2587 }
2588
2589 /**
2590 * Finds the KNS attribute used to render the given KimAttributeData
2591 *
2592 * @return the KNS attribute used to render that qualifier, or null if the AttributeDefinition cannot be determined
2593 */
2594 protected KimAttributeField getAttributeDefinition(String kimTypId, String attrDefnId) {
2595 final KimType type = getKimTypeInfoService().getKimType(kimTypId);
2596 if (type != null) {
2597 final KimTypeService typeService = GlobalResourceLoader.<KimTypeService>getService(QName.valueOf(type.getServiceName()));
2598 if (typeService != null) {
2599 final KimTypeAttribute attributeInfo = type.getAttributeDefinitionById(attrDefnId);
2600 if (attributeInfo != null) {
2601 final List<KimAttributeField> attributeMap = typeService.getAttributeDefinitions(type.getId());
2602 if (attributeMap != null) {
2603 return DataDictionaryTypeServiceHelper.findAttributeField(
2604 attributeInfo.getKimAttribute().getAttributeName(), attributeMap);
2605 }
2606 }
2607 }
2608 }
2609 return null;
2610 }
2611
2612 /**
2613 * Formats the attribute value on this checkbox attribute, changing "on" to "Y" and "off" to "N"
2614 *
2615 * @param roleMemberAttributeData the attribute data to format the attribute value of
2616 */
2617 protected void convertCheckboxAttributeData(RoleMemberAttributeDataBo roleMemberAttributeData) {
2618 if (roleMemberAttributeData.getAttributeValue().equalsIgnoreCase(KimConstants.KIM_ATTRIBUTE_BOOLEAN_TRUE_STR_VALUE_DISPLAY)) {
2619 roleMemberAttributeData.setAttributeValue(KimConstants.KIM_ATTRIBUTE_BOOLEAN_TRUE_STR_VALUE);
2620 } else if (roleMemberAttributeData.getAttributeValue().equalsIgnoreCase(KimConstants.KIM_ATTRIBUTE_BOOLEAN_FALSE_STR_VALUE_DISPLAY)) {
2621 roleMemberAttributeData.setAttributeValue(KimConstants.KIM_ATTRIBUTE_BOOLEAN_FALSE_STR_VALUE);
2622 }
2623 }
2624
2625 protected List<DelegateTypeBo> getRoleDelegations(IdentityManagementRoleDocument identityManagementRoleDocument, List<DelegateTypeBo> origDelegations){
2626 List<DelegateTypeBo> kimDelegations = new ArrayList<DelegateTypeBo>();
2627 DelegateTypeBo newKimDelegation;
2628 DelegateTypeBo origDelegationImplTemp = null;
2629 List<DelegateMemberBo> origMembers;
2630 List<DelegateMemberBo> allOrigMembers = new ArrayList<DelegateMemberBo>();;
2631 boolean activatingInactive = false;
2632 String newDelegationIdAssigned = "";
2633 if(CollectionUtils.isNotEmpty(identityManagementRoleDocument.getDelegations())){
2634 for(RoleDocumentDelegation roleDocumentDelegation: identityManagementRoleDocument.getDelegations()){
2635 newKimDelegation = new DelegateTypeBo();
2636 KimCommonUtilsInternal.copyProperties(newKimDelegation, roleDocumentDelegation);
2637 newKimDelegation.setRoleId(identityManagementRoleDocument.getRoleId());
2638 if(ObjectUtils.isNotNull(origDelegations)){
2639 for(DelegateTypeBo origDelegationImpl: origDelegations){
2640 if(StringUtils.equals(origDelegationImpl.getRoleId(), newKimDelegation.getRoleId()) &&
2641 StringUtils.equals(origDelegationImpl.getDelegationId(), newKimDelegation.getDelegationId())){
2642 //TODO: verify if you want to add && newRoleMember.isActive() condition to if...
2643 newDelegationIdAssigned = newKimDelegation.getDelegationId();
2644 newKimDelegation.setDelegationId(origDelegationImpl.getDelegationId());
2645 activatingInactive = true;
2646 }
2647 if(origDelegationImpl.getDelegationId()!=null && StringUtils.equals(origDelegationImpl.getDelegationId(), newKimDelegation.getDelegationId())){
2648 newKimDelegation.setVersionNumber(origDelegationImpl.getVersionNumber());
2649 newKimDelegation.setObjectId(origDelegationImpl.getObjectId());
2650 origDelegationImplTemp = origDelegationImpl;
2651 }
2652 for (DelegateMemberBo delegateMemberBo:origDelegationImpl.getMembers() ) {
2653 allOrigMembers.add(delegateMemberBo);
2654 }
2655 }
2656 }
2657 origMembers = (origDelegationImplTemp == null || origDelegationImplTemp.getMembers()==null)?
2658 new ArrayList<DelegateMemberBo>():origDelegationImplTemp.getMembers();
2659 newKimDelegation.setMembers(getDelegationMembers(roleDocumentDelegation.getMembers(), origMembers, allOrigMembers, activatingInactive, newDelegationIdAssigned));
2660 kimDelegations.add(newKimDelegation);
2661 activatingInactive = false;
2662 }
2663 }
2664 return kimDelegations;
2665 }
2666
2667 protected List<DelegateMemberBo> getDelegationMembers(List<RoleDocumentDelegationMember> delegationMembers,
2668 List<DelegateMemberBo> origDelegationMembers, List<DelegateMemberBo> allOrigMembers, boolean activatingInactive, String newDelegationIdAssigned){
2669 List<DelegateMemberBo> delegationsMembersList = new ArrayList<DelegateMemberBo>();
2670 DelegateMemberBo newDelegationMemberImpl;
2671 DelegateMemberBo origDelegationMemberImplTemp = null;
2672 List<DelegateMemberAttributeDataBo> origAttributes;
2673 String delegationMemberId = "";
2674 if(CollectionUtils.isNotEmpty(delegationMembers)){
2675 for(RoleDocumentDelegationMember delegationMember: delegationMembers){
2676 newDelegationMemberImpl = new DelegateMemberBo();
2677 KimCommonUtilsInternal.copyProperties(newDelegationMemberImpl, delegationMember);
2678 newDelegationMemberImpl.setType(MemberType.fromCode(delegationMember.getMemberTypeCode()));
2679 if(ObjectUtils.isNotNull(origDelegationMembers)){
2680 for(DelegateMemberBo origDelegationMember: origDelegationMembers){
2681 if(activatingInactive && StringUtils.equals(origDelegationMember.getMemberId(), newDelegationMemberImpl.getMemberId()) &&
2682 StringUtils.equals(newDelegationMemberImpl.getDelegationId(), newDelegationIdAssigned) &&
2683 !origDelegationMember.isActive(new Timestamp(System.currentTimeMillis()))){
2684 newDelegationMemberImpl.setDelegationId(origDelegationMember.getDelegationId());
2685 delegationMemberId = newDelegationMemberImpl.getDelegationMemberId();
2686 newDelegationMemberImpl.setDelegationMemberId(origDelegationMember.getDelegationMemberId());
2687 }
2688 if(origDelegationMember.getDelegationMemberId()!=null && StringUtils.equals(origDelegationMember.getDelegationMemberId(), newDelegationMemberImpl.getDelegationMemberId())){
2689 newDelegationMemberImpl.setVersionNumber(origDelegationMember.getVersionNumber());
2690 newDelegationMemberImpl.setObjectId(origDelegationMember.getObjectId());
2691 origDelegationMemberImplTemp = origDelegationMember;
2692 }
2693 }
2694 }
2695 for (DelegateMemberBo origMember : allOrigMembers) {
2696 if ((origMember.getDelegationMemberId() != null) &&
2697 (origMember.getDelegationMemberId().equals(delegationMember.getDelegationMemberId())) &&
2698 (origMember.getRoleMemberId() != null) &&
2699 (origMember.getRoleMemberId().equals(delegationMember.getRoleMemberId()))) {
2700 newDelegationMemberImpl.setVersionNumber(origMember.getVersionNumber());
2701 newDelegationMemberImpl.setObjectId(origMember.getObjectId());
2702 origDelegationMemberImplTemp = origMember;
2703 }
2704 }
2705 origAttributes = (origDelegationMemberImplTemp==null || origDelegationMemberImplTemp.getAttributeDetails()==null)?
2706 new ArrayList<DelegateMemberAttributeDataBo>():origDelegationMemberImplTemp.getAttributeDetails();
2707 newDelegationMemberImpl.setAttributeDetails(getDelegationMemberAttributeData(delegationMember.getQualifiers(), origAttributes, activatingInactive, delegationMemberId));
2708 newDelegationMemberImpl.setActiveFromDateValue(delegationMember.getActiveFromDate());
2709 newDelegationMemberImpl.setActiveToDateValue(delegationMember.getActiveToDate());
2710 delegationsMembersList.add(newDelegationMemberImpl);
2711 }
2712 }
2713 return delegationsMembersList;
2714 }
2715
2716 //TODO: implement logic same as role members - do not insert qualifiers with blank values
2717 protected List<DelegateMemberAttributeDataBo> getDelegationMemberAttributeData(
2718 List<RoleDocumentDelegationMemberQualifier> qualifiers, List<DelegateMemberAttributeDataBo> origAttributes,
2719 boolean activatingInactive, String delegationMemberId){
2720 List<DelegateMemberAttributeDataBo> delegationMemberAttributeDataList = new ArrayList<DelegateMemberAttributeDataBo>();
2721 DelegateMemberAttributeDataBo newDelegationMemberAttributeData;
2722 if(CollectionUtils.isNotEmpty(qualifiers)){
2723 for(RoleDocumentDelegationMemberQualifier memberRoleQualifier: qualifiers){
2724 if(StringUtils.isNotBlank(memberRoleQualifier.getAttrVal())){
2725 newDelegationMemberAttributeData = new DelegateMemberAttributeDataBo();
2726 newDelegationMemberAttributeData.setId(memberRoleQualifier.getAttrDataId());
2727 newDelegationMemberAttributeData.setAttributeValue(memberRoleQualifier.getAttrVal());
2728 newDelegationMemberAttributeData.setAssignedToId(memberRoleQualifier.getDelegationMemberId());
2729 newDelegationMemberAttributeData.setKimTypeId(memberRoleQualifier.getKimTypId());
2730 newDelegationMemberAttributeData.setKimAttributeId(memberRoleQualifier.getKimAttrDefnId());
2731 if(ObjectUtils.isNotNull(origAttributes)){
2732 for(DelegateMemberAttributeDataBo origAttribute: origAttributes){
2733 if(activatingInactive && StringUtils.equals(origAttribute.getKimAttributeId(), newDelegationMemberAttributeData.getKimAttributeId()) &&
2734 StringUtils.equals(newDelegationMemberAttributeData.getAssignedToId(), delegationMemberId)){
2735 newDelegationMemberAttributeData.setAssignedToId(origAttribute.getAssignedToId());
2736 newDelegationMemberAttributeData.setId(origAttribute.getId());
2737 }
2738 if(StringUtils.equals(origAttribute.getId(), newDelegationMemberAttributeData.getId())){
2739 newDelegationMemberAttributeData.setVersionNumber(origAttribute.getVersionNumber());
2740 }
2741 }
2742 }
2743 delegationMemberAttributeDataList.add(newDelegationMemberAttributeData);
2744 }
2745 }
2746 }
2747 return delegationMemberAttributeDataList;
2748 }
2749
2750 /* Group document methods */
2751 public void loadGroupDoc(IdentityManagementGroupDocument identityManagementGroupDocument, Group groupInfo){
2752 //Map<String, String> criteria = new HashMap<String, String>();
2753 //criteria.put(KimApiConstants.PrimaryKeyConstants.GROUP_ID, groupInfo.getId());
2754 //GroupImpl kimGroupImpl = (GroupImpl)
2755 // getBusinessObjectService().findByPrimaryKey(GroupImpl.class, criteria);
2756
2757 identityManagementGroupDocument.setGroupId(groupInfo.getId());
2758 KimType kimType = KimApiServiceLocator.getKimTypeInfoService().getKimType(groupInfo.getKimTypeId());
2759 identityManagementGroupDocument.setKimType(kimType);
2760 identityManagementGroupDocument.setGroupTypeName(kimType.getName());
2761 identityManagementGroupDocument.setGroupTypeId(kimType.getId());
2762 identityManagementGroupDocument.setGroupName(groupInfo.getName());
2763 identityManagementGroupDocument.setGroupDescription(groupInfo.getDescription());
2764 identityManagementGroupDocument.setActive(groupInfo.isActive());
2765 identityManagementGroupDocument.setGroupNamespace(groupInfo.getNamespaceCode());
2766
2767 List<GroupMember> members = new ArrayList(KimApiServiceLocator.getGroupService().getMembersOfGroup(groupInfo.getId()));
2768 identityManagementGroupDocument.setMembers(loadGroupMembers(identityManagementGroupDocument, members));
2769
2770
2771
2772 identityManagementGroupDocument.setQualifiers(loadGroupQualifiers(identityManagementGroupDocument, groupInfo.getAttributes()));
2773 identityManagementGroupDocument.setEditing(true);
2774 }
2775
2776 protected static class GroupMemberNameComparator implements Comparator<GroupDocumentMember> {
2777 /**
2778 * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
2779 */
2780 public int compare(GroupDocumentMember m1, GroupDocumentMember m2) {
2781 return m1.getMemberName().compareToIgnoreCase(m2.getMemberName());
2782 }
2783 }
2784
2785 protected GroupMemberNameComparator groupMemberNameComparator = new GroupMemberNameComparator();
2786
2787 protected List<GroupDocumentMember> loadGroupMembers(
2788 IdentityManagementGroupDocument identityManagementGroupDocument, List<GroupMember> members){
2789 List<GroupDocumentMember> pndMembers = new ArrayList<GroupDocumentMember>();
2790 GroupDocumentMember pndMember = new GroupDocumentMember();
2791 if(ObjectUtils.isNotNull(members)){
2792 for(GroupMember member: members){
2793 pndMember = new GroupDocumentMember();
2794
2795 pndMember.setActiveFromDate(member.getActiveFromDate() == null ? null : new Timestamp(member.getActiveFromDate().getMillis()));
2796 pndMember.setActiveToDate(member.getActiveToDate() == null ? null : new Timestamp(member.getActiveToDate().getMillis()));
2797 //pndMember.setActive(member.isActive());
2798 if(pndMember.isActive()){
2799 pndMember.setGroupMemberId(member.getMemberId());
2800 pndMember.setGroupId(member.getGroupId());
2801 pndMember.setMemberId(member.getMemberId());
2802 pndMember.setMemberName(getMemberName(member.getType(), member.getMemberId()));
2803 pndMember.setMemberFullName(getMemberFullName(member.getType(), member.getMemberId()));
2804 pndMember.setMemberTypeCode(member.getType().getCode());
2805 pndMember.setEdit(true);
2806 pndMembers.add(pndMember);
2807 }
2808 }
2809 }
2810 Collections.sort(pndMembers, groupMemberNameComparator);
2811 return pndMembers;
2812 }
2813
2814 protected List<GroupDocumentQualifier> loadGroupQualifiers(IdentityManagementGroupDocument IdentityManagementGroupDocument,
2815 Map<String, String> attributes){
2816 List<GroupDocumentQualifier> pndGroupQualifiers = new ArrayList<GroupDocumentQualifier>();
2817 GroupDocumentQualifier pndGroupQualifier = new GroupDocumentQualifier();
2818 List<KimAttributeField> origAttributes = IdentityManagementGroupDocument.getDefinitions();
2819 boolean attributePresent = false;
2820 String origAttributeId;
2821 if(origAttributes!=null){
2822
2823 for(KimAttributeField key: origAttributes) {
2824 origAttributeId = IdentityManagementGroupDocument.getKimAttributeDefnId(key);
2825 if(!attributes.isEmpty()){
2826
2827 for(GroupAttributeBo groupQualifier: KimAttributeDataBo.createFrom(GroupAttributeBo.class, attributes, IdentityManagementGroupDocument.getGroupTypeId())){
2828 if(origAttributeId!=null && ObjectUtils.isNotNull(groupQualifier.getKimAttribute()) &&
2829 StringUtils.equals(origAttributeId, groupQualifier.getKimAttribute().getId())){
2830 pndGroupQualifier = new GroupDocumentQualifier();
2831 KimCommonUtilsInternal.copyProperties(pndGroupQualifier, groupQualifier);
2832 pndGroupQualifier.setAttrDataId(groupQualifier.getId());
2833 pndGroupQualifier.setAttrVal(groupQualifier.getAttributeValue());
2834 pndGroupQualifier.setKimAttrDefnId(groupQualifier.getKimAttribute().getId());
2835 pndGroupQualifier.setKimTypId(groupQualifier.getKimType().getId());
2836 pndGroupQualifier.setGroupId(groupQualifier.getAssignedToId());
2837 pndGroupQualifiers.add(pndGroupQualifier);
2838 attributePresent = true;
2839 }
2840 }
2841 }
2842 if(!attributePresent){
2843 pndGroupQualifier = new GroupDocumentQualifier();
2844 pndGroupQualifier.setKimAttrDefnId(origAttributeId);
2845 pndGroupQualifiers.add(pndGroupQualifier);
2846 }
2847 attributePresent = false;
2848 }
2849 }
2850 return pndGroupQualifiers;
2851 }
2852
2853 /**
2854 * @see org.kuali.rice.kim.service.UiDocumentService#saveEntityPerson(IdentityManagementPersonDocument)
2855 */
2856 @SuppressWarnings("unchecked")
2857 public void saveGroup(IdentityManagementGroupDocument identityManagementGroupDocument) {
2858 GroupBo kimGroup = new GroupBo();
2859 Map<String, String> criteria = new HashMap<String, String>();
2860 String groupId = identityManagementGroupDocument.getGroupId();
2861 criteria.put("groupId", groupId);
2862 GroupBo origGroup = (GroupBo)getBusinessObjectService().findBySinglePrimaryKey(GroupBo.class, groupId);
2863 List<GroupMemberBo> origGroupMembers = new ArrayList<GroupMemberBo>();
2864 if (ObjectUtils.isNull(origGroup)) {
2865 origGroup = new GroupBo();
2866 kimGroup.setActive(true);
2867 } else {
2868 kimGroup.setVersionNumber(origGroup.getVersionNumber());
2869 //TODO: when a group is inactivated, inactivate the memberships of principals in that group
2870 //and the memberships of that group in roles
2871 kimGroup.setActive(identityManagementGroupDocument.isActive());
2872 origGroupMembers = (List<GroupMemberBo>)getBusinessObjectService().findMatching(GroupMemberBo.class, criteria);
2873 }
2874
2875 kimGroup.setId(identityManagementGroupDocument.getGroupId());
2876 KimType kimType = getKimTypeInfoService().getKimType(identityManagementGroupDocument.getGroupTypeId());
2877 if( kimType == null ) {
2878 throw new RuntimeException("Kim type not found for:"+identityManagementGroupDocument.getGroupTypeId());
2879 }
2880
2881 kimGroup.setKimTypeId(kimType.getId());
2882 kimGroup.setNamespaceCode(identityManagementGroupDocument.getGroupNamespace());
2883 kimGroup.setName(identityManagementGroupDocument.getGroupName());
2884 kimGroup.setDescription(identityManagementGroupDocument.getGroupDescription());
2885 kimGroup.setAttributeDetails(getGroupAttributeData(identityManagementGroupDocument, origGroup.getAttributeDetails()));
2886
2887 List<String> oldIds;
2888 List<String> newIds;
2889 oldIds = getGroupService().getMemberPrincipalIds(kimGroup.getId()); // for the actionList update
2890
2891
2892 List<GroupMemberBo> newGroupMembersList = getGroupMembers(identityManagementGroupDocument, origGroupMembers);
2893 kimGroup.setMembers(newGroupMembersList); // add the new, complete list to the group
2894
2895 kimGroup = (GroupBo)getBusinessObjectService().save(kimGroup);
2896
2897 newIds = kimGroup.getMemberPrincipalIds();
2898 //newIds = getGroupService().getMemberPrincipalIds(kimGroup.getGroupId()); // for the action list update
2899
2900 // Do an async update of the action list for the updated groups
2901 org.kuali.rice.kim.service.KIMServiceLocatorInternal.getGroupInternalService().updateForWorkgroupChange(kimGroup.getId(), oldIds, newIds);
2902 if(!kimGroup.isActive()){
2903 // when a group is inactivated, inactivate the memberships of principals in that group
2904 // and the memberships of that group in roles
2905 KimImplServiceLocator.getRoleInternalService().groupInactivated(identityManagementGroupDocument.getGroupId());
2906 }
2907
2908 }
2909
2910 protected List<GroupMemberBo> getGroupMembers(IdentityManagementGroupDocument identityManagementGroupDocument, List<GroupMemberBo> origGroupMembers){
2911 List<GroupMemberBo> groupMembers = new ArrayList<GroupMemberBo>();
2912 GroupMemberBo newGroupMember;
2913 if(CollectionUtils.isNotEmpty(identityManagementGroupDocument.getMembers())){
2914 for(GroupDocumentMember documentGroupMember: identityManagementGroupDocument.getMembers()){
2915 newGroupMember = new GroupMemberBo();
2916 //KimCommonUtilsInternalInternal.copyProperties(newGroupMember, documentGroupMember);
2917 //copy properties manually for now until new BO created for DocumentGroupMember
2918
2919 newGroupMember.setGroupId(identityManagementGroupDocument.getGroupId());
2920 newGroupMember.setActiveFromDateValue(documentGroupMember.getActiveFromDate());
2921 newGroupMember.setActiveToDateValue(documentGroupMember.getActiveToDate());
2922 newGroupMember.setMemberId(documentGroupMember.getMemberId());
2923 newGroupMember.setTypeCode(documentGroupMember.getMemberTypeCode());
2924 if(ObjectUtils.isNotNull(origGroupMembers)){
2925 for(GroupMemberBo origGroupMemberImpl: origGroupMembers){
2926 if(StringUtils.equals(origGroupMemberImpl.getGroupId(), newGroupMember.getGroupId()) &&
2927 StringUtils.equals(origGroupMemberImpl.getMemberId(), newGroupMember.getMemberId()) &&
2928 !origGroupMemberImpl.isActive(new Timestamp(System.currentTimeMillis()))){
2929 //TODO: verify if you want to add && newGroupMember.isActive() condition to if...
2930 newGroupMember.setMemberId(origGroupMemberImpl.getMemberId());
2931 }
2932 if(StringUtils.equals(origGroupMemberImpl.getGroupId(), newGroupMember.getGroupId()) &&
2933 StringUtils.equals(origGroupMemberImpl.getMemberId(), newGroupMember.getMemberId()) &&
2934 origGroupMemberImpl.isActive(new Timestamp(System.currentTimeMillis()))){
2935 newGroupMember.setId(origGroupMemberImpl.getId());
2936 newGroupMember.setVersionNumber(origGroupMemberImpl.getVersionNumber());
2937 }
2938 }
2939 }
2940 groupMembers.add(newGroupMember);
2941 }
2942 }
2943 return groupMembers;
2944 }
2945
2946 protected List<GroupAttributeBo> getGroupAttributeData(IdentityManagementGroupDocument identityManagementGroupDocument,
2947 List<GroupAttributeBo> origAttributes){
2948 List<GroupAttributeBo> groupAttributeDataList = new ArrayList<GroupAttributeBo>();
2949 GroupAttributeBo newGroupAttributeData;
2950 if(CollectionUtils.isNotEmpty(identityManagementGroupDocument.getQualifiers())){
2951 for(GroupDocumentQualifier groupQualifier: identityManagementGroupDocument.getQualifiers()){
2952 if(StringUtils.isNotBlank(groupQualifier.getAttrVal())){
2953 newGroupAttributeData = new GroupAttributeBo();
2954 newGroupAttributeData.setId(groupQualifier.getAttrDataId());
2955 newGroupAttributeData.setAttributeValue(groupQualifier.getAttrVal());
2956 newGroupAttributeData.setAssignedToId(groupQualifier.getGroupId());
2957 newGroupAttributeData.setKimTypeId(groupQualifier.getKimTypId());
2958 newGroupAttributeData.setKimAttributeId(groupQualifier.getKimAttrDefnId());
2959 if(ObjectUtils.isNotNull(origAttributes)){
2960 for(GroupAttributeBo origAttribute: origAttributes){
2961 if(StringUtils.equals(origAttribute.getKimAttributeId(), newGroupAttributeData.getKimAttributeId()) &&
2962 StringUtils.equals(newGroupAttributeData.getAssignedToId(), origAttribute.getAssignedToId())){
2963 newGroupAttributeData.setId(origAttribute.getId());
2964 }
2965 if(origAttribute.getId()!=null && StringUtils.equals(origAttribute.getId(), newGroupAttributeData.getId())){
2966 newGroupAttributeData.setVersionNumber(origAttribute.getVersionNumber());
2967 }
2968 }
2969 }
2970 groupAttributeDataList.add(newGroupAttributeData);
2971 }
2972 }
2973 }
2974 return groupAttributeDataList;
2975 }
2976
2977 @SuppressWarnings("unchecked")
2978 public KimDocumentRoleMember getKimDocumentRoleMember(MemberType memberType, String memberId, String roleId){
2979 if(memberType == null || StringUtils.isEmpty(memberId) || StringUtils.isEmpty(roleId)) {
2980 return null;
2981 }
2982 KimDocumentRoleMember documentRoleMember = new KimDocumentRoleMember();
2983 documentRoleMember.setRoleId(roleId);
2984 Map<String, String> criteria = new HashMap<String, String>();
2985 criteria.put("roleId", roleId);
2986 criteria.put("mbr_id", memberId);
2987
2988 List<RoleMemberBo> matchingRoleMembers = (List<RoleMemberBo>)getBusinessObjectService().findMatching(RoleMemberBo.class, criteria);
2989 if (matchingRoleMembers==null || matchingRoleMembers.size()<1) { return null; }
2990
2991 RoleMemberBo roleMemberImpl = matchingRoleMembers.get(0);
2992 documentRoleMember.setRoleMemberId(roleMemberImpl.getId());
2993 if(MemberType.PRINCIPAL.equals(memberType)){
2994 Principal principal = getIdentityService().getPrincipal(memberId);
2995 if (principal != null) {
2996 documentRoleMember.setMemberId(principal.getPrincipalId());
2997 documentRoleMember.setMemberName(principal.getPrincipalName());
2998 documentRoleMember.setMemberTypeCode(MemberType.PRINCIPAL.getCode());
2999 }
3000 } else if(MemberType.GROUP.equals(memberType)){
3001 Group group = getGroupService().getGroup(memberId);
3002 if (group != null) {
3003 documentRoleMember.setMemberNamespaceCode(group.getNamespaceCode());
3004 documentRoleMember.setMemberId(group.getId());
3005 documentRoleMember.setMemberName(group.getName());
3006 documentRoleMember.setMemberTypeCode(MemberType.GROUP.getCode());
3007 }
3008
3009 } else if(MemberType.ROLE.equals(memberType)){
3010 Role role = getRoleService().getRole(memberId);
3011 if (role != null) {
3012 documentRoleMember.setMemberNamespaceCode(role.getNamespaceCode());
3013 documentRoleMember.setMemberId(role.getId());
3014 documentRoleMember.setMemberName(role.getName());
3015 documentRoleMember.setMemberTypeCode(MemberType.ROLE.getCode());
3016 }
3017 }
3018 return documentRoleMember;
3019 }
3020
3021 protected Set<String> getChangedRoleResponsibilityIds(
3022 IdentityManagementRoleDocument identityManagementRoleDocument, List<RoleResponsibilityBo> origRoleResponsibilities){
3023 Set<String> lRet = new HashSet<String>();
3024 List<String> newResp = new ArrayList<String>();
3025 List<String> oldResp = new ArrayList<String>();
3026 if(CollectionUtils.isNotEmpty(identityManagementRoleDocument.getResponsibilities())){
3027 for(KimDocumentRoleResponsibility documentRoleResponsibility: identityManagementRoleDocument.getResponsibilities()){
3028 newResp.add(documentRoleResponsibility.getResponsibilityId());
3029 }
3030 }
3031 if(ObjectUtils.isNotNull(origRoleResponsibilities)){
3032 for(RoleResponsibilityBo roleRespBo: origRoleResponsibilities){
3033 oldResp.add(roleRespBo.getResponsibilityId());
3034 }
3035 }
3036 lRet.addAll(newResp);
3037 lRet.addAll(oldResp);
3038
3039 return lRet;
3040 }
3041
3042 public KimTypeInfoService getKimTypeInfoService() {
3043 if ( kimTypeInfoService == null ) {
3044 kimTypeInfoService = KimApiServiceLocator.getKimTypeInfoService();
3045 }
3046 return kimTypeInfoService;
3047 }
3048
3049 public List<KimDocumentRoleMember> getRoleMembers(Map<String,String> fieldValues) {
3050 List<KimDocumentRoleMember> matchingRoleMembers = new ArrayList<KimDocumentRoleMember>();
3051 //Remove since they are KNS fieldValues and not BO
3052 fieldValues.remove(KRADConstants.BACK_LOCATION);
3053 fieldValues.remove(KRADConstants.DOC_FORM_KEY);
3054 fieldValues.remove(KRADConstants.DOC_NUM);
3055
3056
3057
3058 List<RoleMember> matchingRoleMembersTemp = getRoleService().findRoleMembers(toQuery(fieldValues)).getResults();
3059 KimDocumentRoleMember matchingRoleMember;
3060 BusinessObject roleMemberObject;
3061 RoleMemberBo roleMemberBo;
3062 if(CollectionUtils.isNotEmpty(matchingRoleMembersTemp)){
3063 for(RoleMember roleMember: matchingRoleMembersTemp){
3064 roleMemberBo = getRoleMember(roleMember.getId());
3065 roleMemberObject = getMember(roleMemberBo.getType(), roleMemberBo.getMemberId());
3066 matchingRoleMember = new KimDocumentRoleMember();
3067 KimCommonUtilsInternal.copyProperties(matchingRoleMember, roleMemberBo);
3068 matchingRoleMember.setMemberId(roleMemberBo.getMemberId());
3069 matchingRoleMember.setRoleMemberId(roleMemberBo.getId());
3070 matchingRoleMember.setMemberName(getMemberName(roleMemberBo.getType(), roleMemberObject));
3071 matchingRoleMember.setMemberNamespaceCode(getMemberNamespaceCode(roleMemberBo.getType(), roleMemberObject));
3072 matchingRoleMember.setQualifiers(getQualifiers(roleMemberBo.getAttributeDetails()));
3073 matchingRoleMembers.add(matchingRoleMember);
3074 }
3075 }
3076 return matchingRoleMembers;
3077 }
3078
3079 private QueryByCriteria toQuery(Map<String,String> fieldValues) {
3080 String memberTypeCode = fieldValues.get(KIMPropertyConstants.KimMember.MEMBER_TYPE_CODE);
3081 String memberName = fieldValues.get(KimConstants.KimUIConstants.MEMBER_NAME);
3082 String memberNamespaceCode = fieldValues.get(KimConstants.KimUIConstants.MEMBER_NAMESPACE_CODE);
3083
3084 if(StringUtils.isNotEmpty(memberName) || StringUtils.isNotEmpty(memberNamespaceCode)) {
3085 String memberId = getMemberIdByName(MemberType.fromCode(memberTypeCode),memberNamespaceCode,memberName) ;
3086 if(StringUtils.isNotEmpty(memberId)) {
3087 fieldValues.put(KIMPropertyConstants.KimMember.MEMBER_ID, memberId);
3088 }
3089 }
3090
3091 List<Predicate> pred = new ArrayList<Predicate>();
3092
3093 pred.add(PredicateUtils.convertMapToPredicate(fieldValues));
3094 Predicate[] predicates = new Predicate[0];
3095 predicates = pred.toArray(predicates) ;
3096 return QueryByCriteria.Builder.fromPredicates(predicates);
3097 }
3098
3099 private List<KimDocumentRoleQualifier> getQualifiers(List<RoleMemberAttributeDataBo> attributes){
3100 if (attributes==null) {return null;}
3101 List<KimDocumentRoleQualifier> qualifiers = new ArrayList<KimDocumentRoleQualifier>();
3102 KimDocumentRoleQualifier qualifier;
3103 if(ObjectUtils.isNotNull(attributes)){
3104 for(RoleMemberAttributeDataBo attribute: attributes){
3105 qualifier = new KimDocumentRoleQualifier();
3106 qualifier.setAttrDataId(attribute.getId());
3107 qualifier.setAttrVal(attribute.getAttributeValue());
3108 qualifier.setRoleMemberId(attribute.getAssignedToId());
3109 qualifier.setKimTypId(attribute.getKimTypeId());
3110 qualifier.setKimAttrDefnId(attribute.getKimAttributeId());
3111 qualifier.setKimAttribute(attribute.getKimAttribute());
3112 qualifiers.add(qualifier);
3113 }
3114 }
3115 return qualifiers;
3116 }
3117
3118 public ResponsibilityInternalService getResponsibilityInternalService() {
3119 if ( responsibilityInternalService == null ) {
3120 responsibilityInternalService = KimImplServiceLocator.getResponsibilityInternalService();
3121 }
3122 return responsibilityInternalService;
3123 }
3124
3125 public PermissionService getPermissionService() {
3126 if ( permissionService == null ) {
3127 permissionService = KimApiServiceLocator.getPermissionService();
3128 }
3129 return permissionService;
3130 }
3131
3132 public ParameterService getParameterService() {
3133 if ( parameterService == null ) {
3134 parameterService = CoreFrameworkServiceLocator.getParameterService();
3135 }
3136 return parameterService;
3137 }
3138
3139 public void setParameterService(ParameterService parameterService) {
3140 this.parameterService = parameterService;
3141 }
3142
3143 public static IdentityArchiveService getIdentityArchiveService() {
3144 return GlobalResourceLoader.getService(KIM_IDENTITY_ARCHIVE_SERVICE);
3145 }
3146
3147 public UiDocumentServiceDAO getUiDocumentServiceDAO() {
3148 if ( uiDocumentServiceDAO == null ) {
3149 uiDocumentServiceDAO = KIMServiceLocatorInternal.getUiDocumentServiceDAO();
3150 }
3151 return uiDocumentServiceDAO;
3152 }
3153
3154 public void setUiDocumentService(UiDocumentServiceDAO uiDocumentServiceDAO) {
3155 this.uiDocumentServiceDAO = uiDocumentServiceDAO;
3156 }
3157 }