001 /**
002 * Copyright 2005-2013 The Kuali Foundation
003 *
004 * Licensed under the Educational Community License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/ecl2.php
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.kuali.rice.kim.document;
017
018 import org.apache.commons.lang.StringUtils;
019 import org.kuali.rice.kew.framework.postprocessor.DocumentRouteStatusChange;
020 import org.kuali.rice.kim.api.KimConstants;
021 import org.kuali.rice.kim.api.responsibility.ResponsibilityService;
022 import org.kuali.rice.kim.api.services.KimApiServiceLocator;
023 import org.kuali.rice.kim.api.type.KimAttributeField;
024 import org.kuali.rice.kim.api.type.KimType;
025 import org.kuali.rice.kim.bo.ui.KimDocumentRoleMember;
026 import org.kuali.rice.kim.bo.ui.KimDocumentRolePermission;
027 import org.kuali.rice.kim.bo.ui.KimDocumentRoleQualifier;
028 import org.kuali.rice.kim.bo.ui.KimDocumentRoleResponsibility;
029 import org.kuali.rice.kim.bo.ui.KimDocumentRoleResponsibilityAction;
030 import org.kuali.rice.kim.bo.ui.RoleDocumentDelegation;
031 import org.kuali.rice.kim.bo.ui.RoleDocumentDelegationMember;
032 import org.kuali.rice.kim.bo.ui.RoleDocumentDelegationMemberQualifier;
033 import org.kuali.rice.kim.impl.responsibility.ResponsibilityInternalService;
034 import org.kuali.rice.kim.impl.services.KimImplServiceLocator;
035 import org.kuali.rice.kim.impl.type.IdentityManagementTypeAttributeTransactionalDocument;
036 import org.kuali.rice.kim.service.KIMServiceLocatorInternal;
037 import org.kuali.rice.kim.web.struts.form.IdentityManagementRoleDocumentForm;
038 import org.kuali.rice.krad.service.SequenceAccessorService;
039 import org.kuali.rice.krad.util.ObjectUtils;
040 import org.springframework.util.AutoPopulatingList;
041
042 import javax.persistence.Transient;
043 import java.util.ArrayList;
044 import java.util.Comparator;
045 import java.util.List;
046
047
048 /**
049 * This is a description of what this class does - bhargavp don't forget to fill this in.
050 *
051 * @author Kuali Rice Team (rice.collab@kuali.org)
052 *
053 */
054 public class IdentityManagementRoleDocument extends IdentityManagementTypeAttributeTransactionalDocument {
055
056 private static final long serialVersionUID = 1L;
057 // principal data
058 protected String roleId;
059 protected String roleTypeId;
060 protected String roleTypeName;
061 protected String roleNamespace = "";
062 protected String roleName = "";
063 protected String roleDescription = "";
064
065 protected boolean active = true;
066
067 protected boolean editing;
068
069 protected List<KimDocumentRolePermission> permissions = new AutoPopulatingList(KimDocumentRolePermission.class);
070 protected List<KimDocumentRoleResponsibility> responsibilities = new AutoPopulatingList(KimDocumentRoleResponsibility.class);
071 protected List<KimDocumentRoleMember> modifiedMembers = new AutoPopulatingList(KimDocumentRoleMember.class);
072 private List<RoleDocumentDelegationMember> delegationMembers = new AutoPopulatingList(RoleDocumentDelegationMember.class);
073 private List<RoleDocumentDelegation> delegations = new AutoPopulatingList(RoleDocumentDelegation.class);
074
075 @Transient
076 protected List<KimDocumentRoleMember> searchResultMembers = new AutoPopulatingList(KimDocumentRoleMember.class);
077 @Transient
078 protected List<KimDocumentRoleMember> members = new AutoPopulatingList(KimDocumentRoleMember.class);
079 @Transient
080 transient private ResponsibilityService responsibilityService;
081 transient private ResponsibilityInternalService responsibilityInternalService;
082
083 public IdentityManagementRoleDocument() {
084 }
085
086 /**
087 * @return the active
088 */
089 public boolean isActive() {
090 return this.active;
091 }
092
093 /**
094 * @param active the active to set
095 */
096 public void setActive(boolean active) {
097 this.active = active;
098 }
099
100 /**
101 * @param roleId the roleId to set
102 */
103 public void setRoleId(String roleId) {
104 this.roleId = roleId;
105 }
106
107 /**
108 * @return the roleName
109 */
110 public String getRoleName() {
111 return this.roleName;
112 }
113
114 /**
115 * @param roleName the roleName to set
116 */
117 public void setRoleName(String roleName) {
118 this.roleName = roleName;
119 }
120
121 /**
122 * @return the roleDescription
123 */
124 public String getRoleDescription() {
125 return this.roleDescription;
126 }
127
128 /**
129 * @param roleDescription the roleDescription to set
130 */
131 public void setRoleDescription(String roleDescription) {
132 this.roleDescription = roleDescription;
133 }
134
135 /**
136 * @return the roleNamespace
137 */
138 public String getRoleNamespace() {
139 return this.roleNamespace;
140 }
141
142 /**
143 * @param roleNamespace the roleNamespace to set
144 */
145 public void setRoleNamespace(String roleNamespace) {
146 this.roleNamespace = roleNamespace;
147 }
148
149 /**
150 * @return the roleTypeId
151 */
152 public String getRoleTypeId() {
153 return this.roleTypeId;
154 }
155
156 /**
157 * @param roleTypeId the roleTypeId to set
158 */
159 public void setRoleTypeId(String roleTypeId) {
160 this.roleTypeId = roleTypeId;
161 }
162
163 /**
164 * @return the roleTypeName
165 */
166 public String getRoleTypeName() {
167 if ( roleTypeName == null ) {
168 if ( kimType != null ) {
169 roleTypeName = kimType.getName();
170 } else if ( roleTypeId != null ) {
171 setKimType( KimApiServiceLocator.getKimTypeInfoService().getKimType(roleTypeId) );
172 if ( kimType != null ) {
173 roleTypeName = kimType.getName();
174 }
175 }
176 }
177 return this.roleTypeName;
178 }
179
180 /**
181 * @param roleTypeName the roleTypeName to set
182 */
183 public void setRoleTypeName(String roleTypeName) {
184 this.roleTypeName = roleTypeName;
185 }
186
187 /**
188 * @return the delegationMembers
189 */
190 public List<RoleDocumentDelegationMember> getDelegationMembers() {
191 return this.delegationMembers;
192 }
193
194 /**
195 * @param delegationMembers the delegationMembers to set
196 */
197 public void setDelegationMembers(
198 List<RoleDocumentDelegationMember> delegationMembers) {
199 this.delegationMembers = delegationMembers;
200 }
201
202 /**
203 * @return the permissions
204 */
205 public List<KimDocumentRolePermission> getPermissions() {
206 return this.permissions;
207 }
208
209 /**
210 * @param permissions the permissions to set
211 */
212 public void setPermissions(List<KimDocumentRolePermission> permissions) {
213 this.permissions = permissions;
214 }
215
216 /**
217 * @return the responsibilities
218 */
219 public List<KimDocumentRoleResponsibility> getResponsibilities() {
220 return this.responsibilities;
221 }
222
223 /**
224 * @param responsibilities the responsibilities to set
225 */
226 public void setResponsibilities(
227 List<KimDocumentRoleResponsibility> responsibilities) {
228 this.responsibilities = responsibilities;
229 }
230
231 /**
232 * @return the members
233 */
234 public List<KimDocumentRoleMember> getMembers() {
235 return this.members;
236 }
237
238 public enum RoleMemberMetaDataType implements Comparator<KimDocumentRoleMember>{
239 MEMBER_ID("memberId"),
240 MEMBER_NAME("memberName"),
241 FULL_MEMBER_NAME("memberFullName");
242
243 private final String attributeName;
244
245 RoleMemberMetaDataType(String anAttributeName) {
246 this.attributeName = anAttributeName;
247 }
248
249 public String getAttributeName() {
250 return attributeName;
251 }
252
253 @Override
254 public int compare(KimDocumentRoleMember m1, KimDocumentRoleMember m2) {
255 if (m1 == null && m2 == null) {
256 return 0;
257 } else if (m1 == null) {
258 return -1;
259 } else if (m2 == null) {
260 return 1;
261 }
262 if (this.getAttributeName().equals(MEMBER_ID.getAttributeName())) {
263 return m1.getMemberId().compareToIgnoreCase(m2.getMemberId());
264 }
265 else if (this.getAttributeName().equals(FULL_MEMBER_NAME.getAttributeName())) {
266 return m1.getMemberFullName().compareToIgnoreCase(m2.getMemberFullName());
267 }
268 return m1.getMemberName().compareToIgnoreCase(m2.getMemberName());
269 }
270 }
271
272 public void setMemberMetaDataTypeToSort(Integer columnNumber)
273 {
274 switch( columnNumber )
275 {
276 case 1:
277 this.memberMetaDataType = RoleMemberMetaDataType.MEMBER_ID;
278 break;
279 case 2:
280 this.memberMetaDataType = RoleMemberMetaDataType.MEMBER_NAME;
281 break;
282 case 3:
283 this.memberMetaDataType = RoleMemberMetaDataType.FULL_MEMBER_NAME;
284 break;
285 default:
286 this.memberMetaDataType = RoleMemberMetaDataType.MEMBER_NAME;
287 break;
288 }
289 }
290
291 protected RoleMemberMetaDataType memberMetaDataType = RoleMemberMetaDataType.MEMBER_NAME;
292
293 public RoleMemberMetaDataType getMemberMetaDataType() {
294 return memberMetaDataType;
295 }
296
297 public void setMemberMetaDataType(RoleMemberMetaDataType memberMetaDataType) {
298 this.memberMetaDataType = memberMetaDataType;
299 }
300
301 /**
302 * @return the members
303 */
304 public KimDocumentRoleMember getMember(String roleMemberId) {
305 if(StringUtils.isEmpty(roleMemberId)) {return null;}
306 for(KimDocumentRoleMember roleMember: getMembers()){
307 if(roleMemberId.equals(roleMember.getRoleMemberId())) {
308 return roleMember;
309 }
310 }
311 return null;
312 }
313
314 /**
315 * @param members the members to set
316 */
317 public void setMembers(List<KimDocumentRoleMember> members) {
318 this.members = members;
319 }
320
321 /**
322 * @return the modifiedMembers
323 */
324 public List<KimDocumentRoleMember> getModifiedMembers() {
325 return this.modifiedMembers;
326 }
327
328 /**
329 * @param modifiedMembers the modifiedMembers to set
330 */
331 public void setModifiedMembers(List<KimDocumentRoleMember> modifiedMembers) {
332 this.modifiedMembers = modifiedMembers;
333 }
334
335 /**
336 * @return the searchResultMembers
337 */
338 public List<KimDocumentRoleMember> getSearchResultMembers() {
339 return this.searchResultMembers;
340 }
341
342 /**
343 * @param searchResultMembers the searchResultMembers to set
344 */
345 public void setSearchResultMembers(List<KimDocumentRoleMember> searchResultMembers) {
346 this.searchResultMembers = searchResultMembers;
347 }
348
349 public void addResponsibility(KimDocumentRoleResponsibility roleResponsibility){
350 if(!getResponsibilityInternalService().areActionsAtAssignmentLevelById(roleResponsibility.getResponsibilityId())) {
351 roleResponsibility.getRoleRspActions().add(getNewRespAction(roleResponsibility));
352 }
353 getResponsibilities().add(roleResponsibility);
354 }
355
356 protected KimDocumentRoleResponsibilityAction getNewRespAction(KimDocumentRoleResponsibility roleResponsibility){
357 KimDocumentRoleResponsibilityAction roleRspAction = new KimDocumentRoleResponsibilityAction();
358 roleRspAction.setKimResponsibility(roleResponsibility.getKimResponsibility());
359 roleRspAction.setRoleResponsibilityId(roleResponsibility.getRoleResponsibilityId());
360 return roleRspAction;
361 }
362
363 public void addDelegationMember(RoleDocumentDelegationMember newDelegationMember){
364 getDelegationMembers().add(newDelegationMember);
365 }
366
367 /**
368 * @param member the members to set
369 */
370 public void addMember(KimDocumentRoleMember member) {
371 SequenceAccessorService sas = getSequenceAccessorService();
372 Long nextSeq = sas.getNextAvailableSequenceNumber(
373 KimConstants.SequenceNames.KRIM_ROLE_MBR_ID_S,
374 KimDocumentRoleMember.class);
375 String roleMemberId = nextSeq.toString();
376 member.setRoleMemberId(roleMemberId);
377 setupMemberRspActions(member);
378 getModifiedMembers().add(member);
379 }
380
381 public KimDocumentRoleMember getBlankMember() {
382 KimDocumentRoleMember member = new KimDocumentRoleMember();
383 KimDocumentRoleQualifier qualifier;
384 if(getDefinitions()!=null){
385 for(KimAttributeField key : getDefinitions()) {
386 qualifier = new KimDocumentRoleQualifier();
387 qualifier.setKimAttrDefnId(getKimAttributeDefnId(key));
388 member.getQualifiers().add(qualifier);
389 }
390 }
391 setupMemberRspActions(member);
392 return member;
393 }
394
395 public RoleDocumentDelegationMember getBlankDelegationMember() {
396 RoleDocumentDelegationMember member = new RoleDocumentDelegationMember();
397 RoleDocumentDelegationMemberQualifier qualifier;
398 if(getDefinitions()!=null){
399 for(KimAttributeField key : getDefinitions()) {
400 qualifier = new RoleDocumentDelegationMemberQualifier();
401 setAttrDefnIdForDelMemberQualifier(qualifier, key);
402 member.getQualifiers().add(qualifier);
403 }
404 }
405 return member;
406 }
407
408 public void setupMemberRspActions(KimDocumentRoleMember member) {
409 member.getRoleRspActions().clear();
410 for (KimDocumentRoleResponsibility roleResp: getResponsibilities()) {
411 if (getResponsibilityInternalService().areActionsAtAssignmentLevelById(roleResp.getResponsibilityId())) {
412 KimDocumentRoleResponsibilityAction action = new KimDocumentRoleResponsibilityAction();
413 action.setRoleResponsibilityId("*");
414 action.setRoleMemberId(member.getRoleMemberId());
415 member.getRoleRspActions().add(action);
416 break;
417 }
418 }
419 }
420
421 public void updateMembers(IdentityManagementRoleDocumentForm roleDocumentForm){
422 for(KimDocumentRoleMember member: roleDocumentForm.getRoleDocument().getMembers()){
423 roleDocumentForm.getRoleDocument().setupMemberRspActions(member);
424 }
425 }
426
427 public void updateMembers(KimDocumentRoleResponsibility newResponsibility){
428 for(KimDocumentRoleMember member: getMembers()){
429 setupMemberRspActions(newResponsibility, member);
430 }
431 }
432
433 public void setupMemberRspActions(KimDocumentRoleResponsibility roleResp, KimDocumentRoleMember member) {
434 if ((member.getRoleRspActions()==null || member.getRoleRspActions().size()<1) && getResponsibilityInternalService().areActionsAtAssignmentLevelById(roleResp.getResponsibilityId())) {
435 KimDocumentRoleResponsibilityAction action = new KimDocumentRoleResponsibilityAction();
436 action.setRoleResponsibilityId("*");
437 action.setRoleMemberId(member.getRoleMemberId());
438 if(member.getRoleRspActions()==null) {
439 member.setRoleRspActions(new ArrayList<KimDocumentRoleResponsibilityAction>());
440 }
441 member.getRoleRspActions().add(action);
442 }
443 }
444
445 protected void setAttrDefnIdForDelMemberQualifier(RoleDocumentDelegationMemberQualifier qualifier,KimAttributeField definition) {
446 qualifier.setKimAttrDefnId(definition.getId());
447 }
448
449 /**
450 * @see org.kuali.rice.krad.document.DocumentBase#doRouteStatusChange(org.kuali.rice.kew.framework.postprocessor.DocumentRouteStatusChange)
451 */
452 @Override
453 public void doRouteStatusChange(DocumentRouteStatusChange statusChangeEvent) {
454 super.doRouteStatusChange(statusChangeEvent);
455 if (getDocumentHeader().getWorkflowDocument().isProcessed()) {
456 KIMServiceLocatorInternal.getUiDocumentService().saveRole(this);
457 }
458 }
459
460 public void initializeDocumentForNewRole() {
461 if(StringUtils.isBlank(this.roleId)){
462 SequenceAccessorService sas = getSequenceAccessorService();
463 Long nextSeq = sas.getNextAvailableSequenceNumber(
464 KimConstants.SequenceNames.KRIM_ROLE_ID_S, this.getClass());
465 this.roleId = nextSeq.toString();
466 }
467 if(StringUtils.isBlank(this.roleTypeId)) {
468 this.roleTypeId = "1";
469 }
470 }
471
472 public String getRoleId(){
473 if(StringUtils.isBlank(this.roleId)){
474 initializeDocumentForNewRole();
475 }
476 return roleId;
477 }
478
479 @Override
480 public void prepareForSave(){
481 SequenceAccessorService sas = getSequenceAccessorService();
482
483 String roleId;
484 if(StringUtils.isBlank(getRoleId())){
485 Long nextSeq = sas.getNextAvailableSequenceNumber(
486 KimConstants.SequenceNames.KRIM_ROLE_ID_S, this.getClass());
487 roleId = nextSeq.toString();
488 setRoleId(roleId);
489 } else {
490 roleId = getRoleId();
491 }
492
493 if(getPermissions()!=null){
494 String rolePermissionId;
495 for(KimDocumentRolePermission permission: getPermissions()){
496 permission.setRoleId(roleId);
497 if(StringUtils.isBlank(permission.getRolePermissionId())){
498 Long nextSeq = sas.getNextAvailableSequenceNumber(
499 KimConstants.SequenceNames.KRIM_ROLE_PERM_ID_S,
500 KimDocumentRolePermission.class);
501 rolePermissionId = nextSeq.toString();
502 permission.setRolePermissionId(rolePermissionId);
503 }
504 }
505 }
506 if(getResponsibilities()!=null){
507 String roleResponsibilityId;
508 for(KimDocumentRoleResponsibility responsibility: getResponsibilities()){
509 if(StringUtils.isBlank(responsibility.getRoleResponsibilityId())){
510 Long nextSeq = sas.getNextAvailableSequenceNumber(
511 KimConstants.SequenceNames.KRIM_ROLE_RSP_ID_S,
512 KimDocumentRoleResponsibility.class);
513 roleResponsibilityId = nextSeq.toString();
514 responsibility.setRoleResponsibilityId(roleResponsibilityId);
515 }
516 responsibility.setRoleId(roleId);
517 if(!getResponsibilityInternalService().areActionsAtAssignmentLevelById(responsibility.getResponsibilityId())){
518 if(StringUtils.isBlank(responsibility.getRoleRspActions().get(0).getRoleResponsibilityActionId())){
519 Long nextSeq = sas.getNextAvailableSequenceNumber(
520 KimConstants.SequenceNames.KRIM_ROLE_RSP_ACTN_ID_S,
521 KimDocumentRoleResponsibilityAction.class);
522 String roleResponsibilityActionId = nextSeq.toString();
523 responsibility.getRoleRspActions().get(0).setRoleResponsibilityActionId(roleResponsibilityActionId);
524 }
525 responsibility.getRoleRspActions().get(0).setRoleMemberId("*");
526 responsibility.getRoleRspActions().get(0).setDocumentNumber(getDocumentNumber());
527 }
528 }
529 }
530 if(getModifiedMembers()!=null){
531 String roleMemberId;
532 String roleResponsibilityActionId;
533 for(KimDocumentRoleMember member: getModifiedMembers()){
534 member.setRoleId(roleId);
535 if(StringUtils.isBlank(member.getRoleMemberId())){
536 Long nextSeq = sas.getNextAvailableSequenceNumber(
537 KimConstants.SequenceNames.KRIM_ROLE_MBR_ID_S,
538 KimDocumentRoleMember.class);
539 roleMemberId = nextSeq.toString();
540 member.setRoleMemberId(roleMemberId);
541 }
542 for(KimDocumentRoleQualifier qualifier: member.getQualifiers()){
543 qualifier.setKimTypId(getKimType().getId());
544 }
545 for(KimDocumentRoleResponsibilityAction roleRespAction: member.getRoleRspActions()){
546 if(StringUtils.isBlank(roleRespAction.getRoleResponsibilityActionId())){
547 Long nextSeq = sas.getNextAvailableSequenceNumber(
548 KimConstants.SequenceNames.KRIM_ROLE_RSP_ACTN_ID_S,
549 KimDocumentRoleResponsibilityAction.class);
550 roleResponsibilityActionId = nextSeq.toString();
551 roleRespAction.setRoleResponsibilityActionId(roleResponsibilityActionId);
552 }
553 roleRespAction.setRoleMemberId(member.getRoleMemberId());
554 roleRespAction.setDocumentNumber(getDocumentNumber());
555 if ( !StringUtils.equals( roleRespAction.getRoleResponsibilityId(), "*" ) ) {
556 for(KimDocumentRoleResponsibility responsibility: getResponsibilities()){
557 if( StringUtils.equals( roleRespAction.getKimResponsibility().getId(), responsibility.getResponsibilityId() ) ) {
558 roleRespAction.setRoleResponsibilityId(responsibility.getRoleResponsibilityId());
559 }
560 }
561 }
562 if (ObjectUtils.isNull(roleRespAction.getVersionNumber())) {
563 roleRespAction.setVersionNumber(new Long(1));
564 }
565 }
566 }
567 }
568 if(getDelegationMembers()!=null){
569 for(RoleDocumentDelegationMember delegationMember: getDelegationMembers()){
570 delegationMember.setDocumentNumber(getDocumentNumber());
571 addDelegationMemberToDelegation(delegationMember);
572 }
573 for(RoleDocumentDelegation delegation: getDelegations()){
574 delegation.setDocumentNumber(getDocumentNumber());
575 delegation.setKimTypeId(getKimType().getId());
576 List<RoleDocumentDelegationMember> membersToRemove = new AutoPopulatingList(RoleDocumentDelegationMember.class);
577 for(RoleDocumentDelegationMember member: delegation.getMembers()){
578 if (delegation.getDelegationId().equals(member.getDelegationId()) &&
579 delegation.getDelegationTypeCode().equals(member.getDelegationTypeCode())) {
580 for(RoleDocumentDelegationMemberQualifier qualifier: member.getQualifiers()){
581 qualifier.setKimTypId(getKimType().getId());
582 }
583 } else {
584 membersToRemove.add(member);
585 }
586 }
587 if (!membersToRemove.isEmpty()) {
588 for(RoleDocumentDelegationMember member: membersToRemove) {
589 delegation.getMembers().remove(member);
590 }
591 }
592 delegation.setRoleId(roleId);
593 }
594 }
595 }
596
597 public ResponsibilityService getResponsibilityService() {
598 if ( responsibilityService == null ) {
599 responsibilityService = KimApiServiceLocator.getResponsibilityService();
600 }
601 return responsibilityService;
602 }
603
604 public ResponsibilityInternalService getResponsibilityInternalService() {
605 if ( responsibilityInternalService == null ) {
606 responsibilityInternalService = KimImplServiceLocator.getResponsibilityInternalService();
607 }
608 return responsibilityInternalService;
609 }
610
611 /**
612 * @return the editing
613 */
614 public boolean isEditing() {
615 return this.editing;
616 }
617
618 /**
619 * @param editing the editing to set
620 */
621 public void setEditing(boolean editing) {
622 this.editing = editing;
623 }
624
625 /**
626 * @return the delegations
627 */
628 public List<RoleDocumentDelegation> getDelegations() {
629 return this.delegations;
630 }
631
632 /**
633 * @param delegations the delegations to set
634 */
635 public void setDelegations(List<RoleDocumentDelegation> delegations) {
636 this.delegations = delegations;
637 }
638
639 public void setKimType(KimType kimType) {
640 super.setKimType(kimType);
641 if (kimType != null){
642 setRoleTypeId(kimType.getId());
643 setRoleTypeName(kimType.getName());
644 }
645 }
646 }