001 /** 002 * Copyright 2005-2011 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.web.struts.action; 017 018 import org.apache.commons.lang.StringUtils; 019 import org.apache.struts.action.ActionForm; 020 import org.apache.struts.action.ActionForward; 021 import org.apache.struts.action.ActionMapping; 022 import org.kuali.rice.core.api.membership.MemberType; 023 import org.kuali.rice.core.api.util.RiceConstants; 024 import org.kuali.rice.core.api.util.RiceKeyConstants; 025 import org.kuali.rice.kew.api.exception.WorkflowException; 026 import org.kuali.rice.kim.api.KimConstants; 027 import org.kuali.rice.kim.api.group.Group; 028 import org.kuali.rice.kim.api.identity.entity.EntityDefault; 029 import org.kuali.rice.kim.api.identity.principal.Principal; 030 import org.kuali.rice.kim.api.role.Role; 031 import org.kuali.rice.kim.api.services.KimApiServiceLocator; 032 import org.kuali.rice.kim.api.type.KimAttributeField; 033 import org.kuali.rice.kim.bo.ui.KimDocumentRoleMember; 034 import org.kuali.rice.kim.bo.ui.KimDocumentRoleQualifier; 035 import org.kuali.rice.kim.bo.ui.KimDocumentRoleResponsibilityAction; 036 import org.kuali.rice.kim.bo.ui.PersonDocumentAddress; 037 import org.kuali.rice.kim.bo.ui.PersonDocumentAffiliation; 038 import org.kuali.rice.kim.bo.ui.PersonDocumentCitizenship; 039 import org.kuali.rice.kim.bo.ui.PersonDocumentEmail; 040 import org.kuali.rice.kim.bo.ui.PersonDocumentEmploymentInfo; 041 import org.kuali.rice.kim.bo.ui.PersonDocumentGroup; 042 import org.kuali.rice.kim.bo.ui.PersonDocumentName; 043 import org.kuali.rice.kim.bo.ui.PersonDocumentPhone; 044 import org.kuali.rice.kim.bo.ui.PersonDocumentRole; 045 import org.kuali.rice.kim.bo.ui.RoleDocumentDelegationMember; 046 import org.kuali.rice.kim.bo.ui.RoleDocumentDelegationMemberQualifier; 047 import org.kuali.rice.kim.document.IdentityManagementPersonDocument; 048 import org.kuali.rice.kim.document.rule.AttributeValidationHelper; 049 import org.kuali.rice.kim.framework.type.KimTypeService; 050 import org.kuali.rice.kim.impl.KIMPropertyConstants; 051 import org.kuali.rice.kim.impl.responsibility.ResponsibilityInternalService; 052 import org.kuali.rice.kim.impl.role.RoleBo; 053 import org.kuali.rice.kim.impl.role.RoleMemberBo; 054 import org.kuali.rice.kim.impl.role.RoleResponsibilityBo; 055 import org.kuali.rice.kim.impl.services.KimImplServiceLocator; 056 import org.kuali.rice.kim.impl.type.KimTypeAttributesHelper; 057 import org.kuali.rice.kim.impl.type.KimTypeBo; 058 import org.kuali.rice.kim.rule.event.ui.AddGroupEvent; 059 import org.kuali.rice.kim.rule.event.ui.AddPersonDelegationMemberEvent; 060 import org.kuali.rice.kim.rule.event.ui.AddPersonDocumentRoleQualifierEvent; 061 import org.kuali.rice.kim.rule.event.ui.AddRoleEvent; 062 import org.kuali.rice.kim.rules.ui.PersonDocumentRoleRule; 063 import org.kuali.rice.kim.service.KIMServiceLocatorInternal; 064 import org.kuali.rice.kim.web.struts.form.IdentityManagementPersonDocumentForm; 065 import org.kuali.rice.kns.web.struts.form.KualiDocumentFormBase; 066 import org.kuali.rice.krad.util.GlobalVariables; 067 import org.kuali.rice.krad.util.KRADConstants; 068 import org.kuali.rice.krad.util.UrlFactory; 069 070 import javax.servlet.http.HttpServletRequest; 071 import javax.servlet.http.HttpServletResponse; 072 import java.sql.Timestamp; 073 import java.text.MessageFormat; 074 import java.util.ArrayList; 075 import java.util.Calendar; 076 import java.util.List; 077 import java.util.Map; 078 import java.util.Properties; 079 080 /** 081 * This is a description of what this class does - shyu don't forget to fill this in. 082 * 083 * @author Kuali Rice Team (rice.collab@kuali.org) 084 * 085 */ 086 public class IdentityManagementPersonDocumentAction extends IdentityManagementDocumentActionBase { 087 088 protected ResponsibilityInternalService responsibilityInternalService; 089 090 @Override 091 public ActionForward execute(ActionMapping mapping, ActionForm form, 092 HttpServletRequest request, HttpServletResponse response) 093 throws Exception { 094 ActionForward forward; 095 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 096 // accept either the principal name or principal ID, looking up the latter if necessary 097 // this allows inquiry links to work even when only the principal name is present 098 String principalId = request.getParameter(KIMPropertyConstants.Person.PRINCIPAL_ID); 099 String principalName = request.getParameter(KIMPropertyConstants.Person.PRINCIPAL_NAME); 100 if ( StringUtils.isBlank(principalId) && StringUtils.isNotBlank(principalName) ) { 101 Principal principal = KimApiServiceLocator.getIdentityService().getPrincipalByPrincipalName(principalName); 102 if ( principal != null ) { 103 principalId = principal.getPrincipalId(); 104 } 105 } 106 if ( principalId != null ) { 107 personDocumentForm.setPrincipalId(principalId); 108 } 109 forward = super.execute(mapping, form, request, response); 110 111 personDocumentForm.setCanModifyEntity(getUiDocumentService().canModifyEntity(GlobalVariables.getUserSession().getPrincipalId(), personDocumentForm.getPrincipalId())); 112 EntityDefault origEntity = null; 113 if(personDocumentForm.getPersonDocument()!=null) { 114 origEntity = getIdentityService().getEntityDefault(personDocumentForm.getPersonDocument().getEntityId()); 115 } 116 boolean isCreatingNew = (personDocumentForm.getPersonDocument()==null || origEntity==null)?true:false; 117 personDocumentForm.setCanOverrideEntityPrivacyPreferences(isCreatingNew || getUiDocumentService().canOverrideEntityPrivacyPreferences(GlobalVariables.getUserSession().getPrincipalId(), personDocumentForm.getPrincipalId())); 118 return forward; 119 } 120 121 @Override 122 protected void loadDocument(KualiDocumentFormBase form) 123 throws WorkflowException { 124 super.loadDocument(form); 125 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 126 IdentityManagementPersonDocument personDoc = personDocumentForm.getPersonDocument(); 127 populateRoleInformation(personDoc); 128 } 129 130 protected void populateRoleInformation( IdentityManagementPersonDocument personDoc ) { 131 for (PersonDocumentRole role : personDoc.getRoles()) { 132 // try { 133 KimTypeService kimTypeService = getKimTypeService(KimTypeBo.to(role.getKimRoleType())); 134 if ( kimTypeService != null ) { 135 role.setDefinitions(kimTypeService.getAttributeDefinitions(role.getKimTypeId())); 136 } 137 // when post again, it will need this during populate 138 role.setNewRolePrncpl(new KimDocumentRoleMember()); 139 for (KimAttributeField key : role.getDefinitions()) { 140 KimDocumentRoleQualifier qualifier = new KimDocumentRoleQualifier(); 141 //qualifier.setQualifierKey(key); 142 setAttrDefnIdForQualifier(qualifier,key); 143 role.getNewRolePrncpl().getQualifiers().add(qualifier); 144 } 145 role.setAttributeEntry( getUiDocumentService().getAttributeEntries( role.getDefinitions() ) ); 146 } 147 } 148 149 @Override 150 protected void createDocument(KualiDocumentFormBase form) 151 throws WorkflowException { 152 super.createDocument(form); 153 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 154 if(StringUtils.isBlank(personDocumentForm.getPrincipalId())){ 155 personDocumentForm.getPersonDocument().initializeDocumentForNewPerson(); 156 personDocumentForm.setPrincipalId(personDocumentForm.getPersonDocument().getPrincipalId()); 157 } else { 158 getUiDocumentService().loadEntityToPersonDoc(personDocumentForm.getPersonDocument(), personDocumentForm.getPrincipalId() ); 159 populateRoleInformation( personDocumentForm.getPersonDocument() ); 160 if(personDocumentForm.getPersonDocument()!=null) { 161 personDocumentForm.getPersonDocument().setIfRolesEditable(); 162 } 163 } 164 } 165 166 /*** 167 * @see org.kuali.rice.kim.web.struts.action.IdentityManagementDocumentActionBase#getActionName() 168 */ 169 @Override 170 public String getActionName(){ 171 return KimConstants.KimUIConstants.KIM_PERSON_DOCUMENT_ACTION; 172 } 173 174 public ActionForward addAffln(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 175 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 176 PersonDocumentAffiliation newAffln = personDocumentForm.getNewAffln(); 177 newAffln.setDocumentNumber(personDocumentForm.getPersonDocument().getDocumentNumber()); 178 newAffln.refreshReferenceObject("affiliationType"); 179 personDocumentForm.getPersonDocument().getAffiliations().add(newAffln); 180 personDocumentForm.setNewAffln(new PersonDocumentAffiliation()); 181 return mapping.findForward(RiceConstants.MAPPING_BASIC); 182 } 183 184 public ActionForward deleteAffln(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 185 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 186 personDocumentForm.getPersonDocument().getAffiliations().remove(getLineToDelete(request)); 187 return mapping.findForward(RiceConstants.MAPPING_BASIC); 188 } 189 public ActionForward addCitizenship(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 190 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 191 PersonDocumentCitizenship newCitizenship = personDocumentForm.getNewCitizenship(); 192 personDocumentForm.getPersonDocument().getCitizenships().add(newCitizenship); 193 personDocumentForm.setNewCitizenship(new PersonDocumentCitizenship()); 194 return mapping.findForward(RiceConstants.MAPPING_BASIC); 195 } 196 197 public ActionForward deleteCitizenship(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 198 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 199 personDocumentForm.getPersonDocument().getCitizenships().remove(getLineToDelete(request)); 200 return mapping.findForward(RiceConstants.MAPPING_BASIC); 201 } 202 203 public ActionForward addEmpInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 204 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 205 IdentityManagementPersonDocument personDOc = personDocumentForm.getPersonDocument(); 206 PersonDocumentAffiliation affiliation = personDOc.getAffiliations().get(getSelectedLine(request)); 207 PersonDocumentEmploymentInfo newempInfo = affiliation.getNewEmpInfo(); 208 newempInfo.setDocumentNumber(personDOc.getDocumentNumber()); 209 newempInfo.setVersionNumber(new Long(1)); 210 affiliation.getEmpInfos().add(newempInfo); 211 affiliation.setNewEmpInfo(new PersonDocumentEmploymentInfo()); 212 return mapping.findForward(RiceConstants.MAPPING_BASIC); 213 } 214 215 public ActionForward deleteEmpInfo(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 216 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 217 String selectedIndexes = getSelectedParentChildIdx(request); 218 if (selectedIndexes != null) { 219 String [] indexes = StringUtils.split(selectedIndexes,":"); 220 PersonDocumentAffiliation affiliation = personDocumentForm.getPersonDocument().getAffiliations().get(Integer.parseInt(indexes[0])); 221 affiliation.getEmpInfos().remove(Integer.parseInt(indexes[1])); 222 } 223 return mapping.findForward(RiceConstants.MAPPING_BASIC); 224 } 225 226 protected String getSelectedParentChildIdx(HttpServletRequest request) { 227 String lineNumber = null; 228 String parameterName = (String) request.getAttribute(KRADConstants.METHOD_TO_CALL_ATTRIBUTE); 229 if (StringUtils.isNotBlank(parameterName)) { 230 lineNumber = StringUtils.substringBetween(parameterName, ".line", "."); 231 } 232 return lineNumber; 233 } 234 235 public ActionForward addName(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 236 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 237 PersonDocumentName newName = personDocumentForm.getNewName(); 238 newName.setDocumentNumber(personDocumentForm.getDocument().getDocumentNumber()); 239 personDocumentForm.getPersonDocument().getNames().add(newName); 240 personDocumentForm.setNewName(new PersonDocumentName()); 241 return mapping.findForward(RiceConstants.MAPPING_BASIC); 242 } 243 244 public ActionForward deleteName(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 245 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 246 personDocumentForm.getPersonDocument().getNames().remove(getLineToDelete(request)); 247 return mapping.findForward(RiceConstants.MAPPING_BASIC); 248 } 249 250 public ActionForward addAddress(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 251 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 252 PersonDocumentAddress newAddress = personDocumentForm.getNewAddress(); 253 newAddress.setDocumentNumber(personDocumentForm.getDocument().getDocumentNumber()); 254 personDocumentForm.getPersonDocument().getAddrs().add(newAddress); 255 personDocumentForm.setNewAddress(new PersonDocumentAddress()); 256 return mapping.findForward(RiceConstants.MAPPING_BASIC); 257 } 258 259 public ActionForward deleteAddress(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 260 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 261 personDocumentForm.getPersonDocument().getAddrs().remove(getLineToDelete(request)); 262 return mapping.findForward(RiceConstants.MAPPING_BASIC); 263 } 264 265 public ActionForward addPhone(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 266 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 267 PersonDocumentPhone newPhone = personDocumentForm.getNewPhone(); 268 newPhone.setDocumentNumber(personDocumentForm.getDocument().getDocumentNumber()); 269 personDocumentForm.getPersonDocument().getPhones().add(newPhone); 270 personDocumentForm.setNewPhone(new PersonDocumentPhone()); 271 return mapping.findForward(RiceConstants.MAPPING_BASIC); 272 } 273 274 public ActionForward deletePhone(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 275 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 276 personDocumentForm.getPersonDocument().getPhones().remove(getLineToDelete(request)); 277 return mapping.findForward(RiceConstants.MAPPING_BASIC); 278 } 279 280 public ActionForward addEmail(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 281 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 282 PersonDocumentEmail newEmail = personDocumentForm.getNewEmail(); 283 newEmail.setDocumentNumber(personDocumentForm.getDocument().getDocumentNumber()); 284 personDocumentForm.getPersonDocument().getEmails().add(newEmail); 285 personDocumentForm.setNewEmail(new PersonDocumentEmail()); 286 return mapping.findForward(RiceConstants.MAPPING_BASIC); 287 } 288 289 public ActionForward deleteEmail(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 290 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 291 personDocumentForm.getPersonDocument().getEmails().remove(getLineToDelete(request)); 292 return mapping.findForward(RiceConstants.MAPPING_BASIC); 293 } 294 295 public ActionForward addGroup(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 296 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 297 PersonDocumentGroup newGroup = personDocumentForm.getNewGroup(); 298 if (newGroup.getGroupName() == null 299 && newGroup.getNamespaceCode() == null 300 && newGroup.getGroupId() != null) { 301 Group tempGroup = KimApiServiceLocator.getGroupService().getGroup(newGroup.getGroupId()); 302 newGroup.setGroupName(tempGroup.getName()); 303 newGroup.setNamespaceCode(tempGroup.getNamespaceCode()); 304 newGroup.setKimTypeId(tempGroup.getKimTypeId()); 305 } else if (newGroup.getGroupName() != null 306 && newGroup.getNamespaceCode() != null 307 && newGroup.getGroupId() == null) { 308 Group tempGroup = KimApiServiceLocator.getGroupService().getGroupByNameAndNamespaceCode( 309 newGroup.getNamespaceCode(), newGroup.getGroupName()); 310 newGroup.setGroupId(tempGroup.getId()); 311 newGroup.setKimTypeId(tempGroup.getKimTypeId()); 312 } 313 if (getKualiRuleService().applyRules(new AddGroupEvent("",personDocumentForm.getPersonDocument(), newGroup))) { 314 Group group = getGroupService().getGroup(newGroup.getGroupId()); 315 newGroup.setGroupName(group.getName()); 316 newGroup.setNamespaceCode(group.getNamespaceCode()); 317 newGroup.setKimTypeId(group.getKimTypeId()); 318 personDocumentForm.getPersonDocument().getGroups().add(newGroup); 319 personDocumentForm.setNewGroup(new PersonDocumentGroup()); 320 } 321 return mapping.findForward(RiceConstants.MAPPING_BASIC); 322 } 323 324 public ActionForward deleteGroup(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 325 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 326 PersonDocumentGroup inactivedGroupMembership = personDocumentForm.getPersonDocument().getGroups().get(getLineToDelete(request)); 327 Calendar cal = Calendar.getInstance(); 328 inactivedGroupMembership.setActiveToDate(new Timestamp(cal.getTimeInMillis())); 329 personDocumentForm.getPersonDocument().getGroups().set(getLineToDelete(request), inactivedGroupMembership); 330 return mapping.findForward(RiceConstants.MAPPING_BASIC); 331 } 332 333 public ActionForward addRole(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 334 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 335 PersonDocumentRole newRole = personDocumentForm.getNewRole(); 336 if (getKualiRuleService().applyRules(new AddRoleEvent("",personDocumentForm.getPersonDocument(), newRole))) { 337 Role role = KimApiServiceLocator.getRoleService().getRole(newRole.getRoleId()); 338 if(!validateRole(newRole.getRoleId(), role, PersonDocumentRoleRule.ERROR_PATH, "Person")){ 339 return mapping.findForward(RiceConstants.MAPPING_BASIC); 340 } 341 newRole.setRoleName(role.getName()); 342 newRole.setNamespaceCode(role.getNamespaceCode()); 343 newRole.setKimTypeId(role.getKimTypeId()); 344 if(!validateRoleAssignment(personDocumentForm.getPersonDocument(), newRole)){ 345 return mapping.findForward(RiceConstants.MAPPING_BASIC); 346 } 347 KimTypeService kimTypeService = getKimTypeService(KimTypeBo.to(newRole.getKimRoleType())); 348 //AttributeDefinitionMap definitions = kimTypeService.getAttributeDefinitions(); 349 // role type populated from form is not a complete record 350 if ( kimTypeService != null ) { 351 newRole.setDefinitions(kimTypeService.getAttributeDefinitions(newRole.getKimTypeId())); 352 } 353 // KimDocumentRoleMember newRolePrncpl = newRole.getNewRolePrncpl(); 354 KimDocumentRoleMember newRolePrncpl = newRole.getNewRolePrncpl() == null ? new KimDocumentRoleMember() : newRole.getNewRolePrncpl(); 355 newRole.refreshReferenceObject("assignedResponsibilities"); 356 357 for (KimAttributeField key : newRole.getDefinitions()) { 358 KimDocumentRoleQualifier qualifier = new KimDocumentRoleQualifier(); 359 //qualifier.setQualifierKey(key); 360 setAttrDefnIdForQualifier(qualifier,key); 361 newRolePrncpl.getQualifiers().add(qualifier); 362 } 363 if (newRole.getDefinitions().isEmpty()) { 364 List<KimDocumentRoleMember> rolePrncpls = new ArrayList<KimDocumentRoleMember>(); 365 setupRoleRspActions(newRole, newRolePrncpl); 366 rolePrncpls.add(newRolePrncpl); 367 newRole.setRolePrncpls(rolePrncpls); 368 } 369 //newRole.setNewRolePrncpl(newRolePrncpl); 370 newRole.setAttributeEntry( getUiDocumentService().getAttributeEntries( newRole.getDefinitions() ) ); 371 personDocumentForm.getPersonDocument().getRoles().add(newRole); 372 personDocumentForm.setNewRole(new PersonDocumentRole()); 373 } 374 return mapping.findForward(RiceConstants.MAPPING_BASIC); 375 } 376 /* public ActionForward addRole(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 377 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 378 PersonDocumentRole newRole = personDocumentForm.getNewRole(); 379 380 if (getKualiRuleService().applyRules(new AddRoleEvent("",personDocumentForm.getPersonDocument(), newRole))) { 381 Role role = KimApiServiceLocator.getRoleService().getRole(newRole.getRoleId()); 382 if(!validateRole(newRole.getRoleId(), role, PersonDocumentRoleRule.ERROR_PATH, "Person")){ 383 return mapping.findForward(RiceConstants.MAPPING_BASIC); 384 } 385 newRole.setRoleName(role.getName()); 386 newRole.setNamespaceCode(role.getNamespaceCode()); 387 newRole.setKimTypeId(role.getKimTypeId()); 388 KimDocumentRoleMember roleMember = new KimDocumentRoleMember(); 389 roleMember.setMemberId(personDocumentForm.getPrincipalId()); 390 roleMember.setMemberTypeCode(MemberType.PRINCIPAL.getCode()); 391 roleMember.setRoleId(newRole.getRoleId()); 392 newRole.setNewRolePrncpl(roleMember); 393 if(!validateRoleAssignment(personDocumentForm.getPersonDocument(), newRole)){ 394 return mapping.findForward(RiceConstants.MAPPING_BASIC); 395 } 396 KimTypeService kimTypeService = getKimTypeService(KimTypeBo.to(newRole.getKimRoleType())); 397 //AttributeDefinitionMap definitions = kimTypeService.getAttributeDefinitions(); 398 // role type populated from form is not a complete record 399 if ( kimTypeService != null ) { 400 newRole.setDefinitions(kimTypeService.getAttributeDefinitions(newRole.getKimTypeId())); 401 } 402 KimDocumentRoleMember newRolePrncpl = newRole.getNewRolePrncpl(); 403 newRole.refreshReferenceObject("assignedResponsibilities"); 404 405 for (KimAttributeField key : newRole.getDefinitions()) { 406 KimDocumentRoleQualifier qualifier = new KimDocumentRoleQualifier(); 407 //qualifier.setQualifierKey(key); 408 setAttrDefnIdForQualifier(qualifier,key); 409 newRolePrncpl.getQualifiers().add(qualifier); 410 } 411 if (newRole.getDefinitions().isEmpty()) { 412 List<KimDocumentRoleMember> rolePrncpls = new ArrayList<KimDocumentRoleMember>(); 413 setupRoleRspActions(newRole, newRolePrncpl); 414 rolePrncpls.add(newRolePrncpl); 415 newRole.setRolePrncpls(rolePrncpls); 416 } 417 //newRole.setNewRolePrncpl(newRolePrncpl); 418 newRole.setAttributeEntry( getUiDocumentService().getAttributeEntries( newRole.getDefinitions() ) ); 419 personDocumentForm.getPersonDocument().getRoles().add(newRole); 420 personDocumentForm.setNewRole(new PersonDocumentRole()); 421 } 422 return mapping.findForward(RiceConstants.MAPPING_BASIC); 423 } */ 424 425 protected boolean validateRoleAssignment(IdentityManagementPersonDocument document, PersonDocumentRole newRole){ 426 boolean rulePassed = true; 427 if(!document.validAssignRole(newRole)){ 428 GlobalVariables.getMessageMap().putError("newRole.roleId", 429 RiceKeyConstants.ERROR_ASSIGN_ROLE, 430 new String[] {newRole.getNamespaceCode(), newRole.getRoleName()}); 431 rulePassed = false; 432 } 433 return rulePassed; 434 } 435 436 protected void setupRoleRspActions(PersonDocumentRole role, KimDocumentRoleMember rolePrncpl) { 437 for (RoleResponsibilityBo roleResp : role.getAssignedResponsibilities()) { 438 if (getResponsibilityInternalService().areActionsAtAssignmentLevelById(roleResp.getRoleResponsibilityId())) { 439 KimDocumentRoleResponsibilityAction roleRspAction = new KimDocumentRoleResponsibilityAction(); 440 roleRspAction.setRoleResponsibilityId("*"); 441 roleRspAction.refreshReferenceObject("roleResponsibility"); 442 if(rolePrncpl.getRoleRspActions()==null || rolePrncpl.getRoleRspActions().size()<1){ 443 if(rolePrncpl.getRoleRspActions()==null) { 444 rolePrncpl.setRoleRspActions(new ArrayList<KimDocumentRoleResponsibilityAction>()); 445 } 446 rolePrncpl.getRoleRspActions().add(roleRspAction); 447 } 448 } 449 } 450 } 451 452 // protected boolean isUniqueRoleRspAction(List<KimDocumentRoleResponsibilityAction> roleRspActions, KimDocumentRoleResponsibilityAction roleRspAction){ 453 // if(roleRspActions==null || roleRspAction==null) return false; 454 // for(KimDocumentRoleResponsibilityAction roleRspActionTemp: roleRspActions){ 455 // if((StringUtils.isNotEmpty(roleRspActionTemp.getRoleMemberId()) && roleRspActionTemp.getRoleMemberId().equals(roleRspAction.getRoleMemberId())) && 456 // (StringUtils.isNotEmpty(roleRspActionTemp.getRoleResponsibilityId()) && roleRspActionTemp.getRoleResponsibilityId().equals(roleRspAction.getRoleResponsibilityId()))) 457 // return false; 458 // } 459 // return true; 460 // } 461 462 463 protected void setAttrDefnIdForQualifier(KimDocumentRoleQualifier qualifier,KimAttributeField definition) { 464 qualifier.setKimAttrDefnId(definition.getId()); 465 qualifier.refreshReferenceObject("kimAttribute"); 466 } 467 468 public ActionForward deleteRole(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 469 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 470 personDocumentForm.getPersonDocument().getRoles().remove(getLineToDelete(request)); 471 return mapping.findForward(RiceConstants.MAPPING_BASIC); 472 } 473 474 public ActionForward addRoleQualifier(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 475 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 476 IdentityManagementPersonDocument personDOc = personDocumentForm.getPersonDocument(); 477 int selectedRoleIdx = getSelectedLine(request); 478 PersonDocumentRole role = personDOc.getRoles().get(selectedRoleIdx); 479 KimDocumentRoleMember newRolePrncpl = role.getNewRolePrncpl(); 480 481 if (getKualiRuleService().applyRules(new AddPersonDocumentRoleQualifierEvent("", 482 personDOc, newRolePrncpl, role, selectedRoleIdx))) { 483 setupRoleRspActions(role, newRolePrncpl); 484 role.getRolePrncpls().add(newRolePrncpl); 485 role.setNewRolePrncpl(new KimDocumentRoleMember()); 486 for (KimAttributeField key : role.getDefinitions()) { 487 KimDocumentRoleQualifier qualifier = new KimDocumentRoleQualifier(); 488 //qualifier.setQualifierKey(key); 489 setAttrDefnIdForQualifier(qualifier,key); 490 role.getNewRolePrncpl().getQualifiers().add(qualifier); 491 } 492 } 493 494 return mapping.findForward(RiceConstants.MAPPING_BASIC); 495 } 496 497 public ActionForward deleteRoleQualifier(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 498 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 499 String selectedIndexes = getSelectedParentChildIdx(request); 500 if (selectedIndexes != null) { 501 String [] indexes = StringUtils.split(selectedIndexes,":"); 502 PersonDocumentRole role = personDocumentForm.getPersonDocument().getRoles().get(Integer.parseInt(indexes[0])); 503 role.getRolePrncpls().remove(Integer.parseInt(indexes[1])); 504 } 505 return mapping.findForward(RiceConstants.MAPPING_BASIC); 506 } 507 508 public ActionForward addDelegationMember(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 509 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 510 IdentityManagementPersonDocument personDocument = personDocumentForm.getPersonDocument(); 511 RoleDocumentDelegationMember newDelegationMember = personDocumentForm.getNewDelegationMember(); 512 KimTypeAttributesHelper attrHelper = newDelegationMember.getAttributesHelper(); 513 if (getKualiRuleService().applyRules(new AddPersonDelegationMemberEvent("", personDocumentForm.getPersonDocument(), newDelegationMember))) { 514 //RoleImpl roleBo = (RoleImpl)getUiDocumentService().getMember(KimApiConstants.KimUIConstants.MEMBER_TYPE_ROLE_CODE, newDelegationMember.getRoleDao().getRoleId()); 515 Role role; 516 role = KimApiServiceLocator.getRoleService().getRole(newDelegationMember.getRoleBo().getId()); 517 if (role != null) { 518 if(!validateRole(newDelegationMember.getRoleBo().getId(),role, PersonDocumentRoleRule.ERROR_PATH, "Person")){ 519 return mapping.findForward(RiceConstants.MAPPING_BASIC); 520 } 521 newDelegationMember.setRoleBo(RoleBo.from(role)); 522 } 523 KimAttributeField attrDefinition; 524 RoleMemberBo roleMember = KIMServiceLocatorInternal.getUiDocumentService().getRoleMember(newDelegationMember.getRoleMemberId()); 525 Map<String, String> 526 roleMemberAttributes = (new AttributeValidationHelper()).convertAttributesToMap(roleMember.getAttributeDetails()); 527 for (KimAttributeField key: attrHelper.getDefinitions()) { 528 RoleDocumentDelegationMemberQualifier qualifier = new RoleDocumentDelegationMemberQualifier(); 529 attrDefinition = key; 530 qualifier.setKimAttrDefnId(attrHelper.getKimAttributeDefnId(attrDefinition)); 531 qualifier.setAttrVal(attrHelper.getAttributeValue(roleMemberAttributes, attrDefinition.getAttributeField().getName())); 532 newDelegationMember.setMemberId(personDocument.getPrincipalId()); 533 newDelegationMember.setMemberTypeCode(MemberType.PRINCIPAL.getCode()); 534 newDelegationMember.getQualifiers().add(qualifier); 535 } 536 //newDelegationMember.setAttributeEntry(getUiDocumentService().getAttributeEntries(newDelegationMember.getAttributesHelper().getDefinitions()))); 537 personDocument.getDelegationMembers().add(newDelegationMember); 538 personDocumentForm.setNewDelegationMember(new RoleDocumentDelegationMember()); 539 } 540 return mapping.findForward(RiceConstants.MAPPING_BASIC); 541 } 542 543 public ActionForward deleteDelegationMember(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 544 IdentityManagementPersonDocumentForm personDocumentForm = (IdentityManagementPersonDocumentForm) form; 545 personDocumentForm.getPersonDocument().getDelegationMembers().remove(getLineToDelete(request)); 546 return mapping.findForward(RiceConstants.MAPPING_BASIC); 547 } 548 549 @Override 550 public ActionForward save(ActionMapping mapping, ActionForm form, 551 HttpServletRequest request, HttpServletResponse response) 552 throws Exception { 553 554 return super.save(mapping, form, request, response); 555 } 556 557 @Override 558 public ActionForward refresh(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { 559 IdentityManagementPersonDocumentForm impdForm = (IdentityManagementPersonDocumentForm) form; 560 561 ActionForward forward = this.refreshAfterDelegationMemberRoleSelection(mapping, impdForm, request); 562 if (forward != null) { 563 return forward; 564 } 565 566 return super.refresh(mapping, form, request, response); 567 } 568 569 protected ActionForward refreshAfterDelegationMemberRoleSelection(ActionMapping mapping, IdentityManagementPersonDocumentForm impdForm, HttpServletRequest request) { 570 String refreshCaller = impdForm.getRefreshCaller(); 571 572 boolean isRoleLookupable = KimConstants.KimUIConstants.ROLE_LOOKUPABLE_IMPL.equals(refreshCaller); 573 boolean isRoleMemberLookupable = KimConstants.KimUIConstants.KIM_DOCUMENT_ROLE_MEMBER_LOOKUPABLE_IMPL.equals(refreshCaller); 574 575 // do not execute the further refreshing logic if the refresh caller is not a lookupable 576 if (!isRoleLookupable && !isRoleMemberLookupable) { 577 return null; 578 } 579 580 //In case of delegation member lookup impdForm.getNewDelegationMemberRoleId() will be populated. 581 if(impdForm.getNewDelegationMemberRoleId() == null){ 582 return null; 583 } 584 if(isRoleLookupable){ 585 return renderRoleMemberSelection(mapping, request, impdForm); 586 } 587 588 String roleMemberId = request.getParameter(KimConstants.PrimaryKeyConstants.ROLE_MEMBER_ID); 589 if(StringUtils.isNotBlank(roleMemberId)){ 590 impdForm.getNewDelegationMember().setRoleMemberId(roleMemberId); 591 RoleMemberBo roleMember = getUiDocumentService().getRoleMember(roleMemberId); 592 impdForm.getNewDelegationMember().setRoleMemberMemberId(roleMember.getMemberId()); 593 impdForm.getNewDelegationMember().setRoleMemberMemberTypeCode(roleMember.getType().getCode()); 594 impdForm.getNewDelegationMember().setRoleMemberName(getUiDocumentService().getMemberName(MemberType.fromCode(impdForm.getNewDelegationMember().getRoleMemberMemberTypeCode()), impdForm.getNewDelegationMember().getRoleMemberMemberId())); 595 impdForm.getNewDelegationMember().setRoleMemberNamespaceCode(getUiDocumentService().getMemberNamespaceCode(MemberType.fromCode(impdForm.getNewDelegationMember().getRoleMemberMemberTypeCode()), impdForm.getNewDelegationMember().getRoleMemberMemberId())); 596 597 Role role; 598 role = KimApiServiceLocator.getRoleService().getRole(impdForm.getNewDelegationMember().getRoleBo().getId()); 599 if (role != null) { 600 if(!validateRole(impdForm.getNewDelegationMember().getRoleBo().getId(), role, PersonDocumentRoleRule.ERROR_PATH, "Person")){ 601 return mapping.findForward(RiceConstants.MAPPING_BASIC); 602 } 603 impdForm.getNewDelegationMember().setRoleBo(RoleBo.from(role)); 604 } 605 } 606 impdForm.setNewDelegationMemberRoleId(null); 607 return null; 608 } 609 610 protected ActionForward renderRoleMemberSelection(ActionMapping mapping, HttpServletRequest request, IdentityManagementPersonDocumentForm impdForm) { 611 Properties props = new Properties(); 612 613 props.put(KRADConstants.SUPPRESS_ACTIONS, Boolean.toString(true)); 614 props.put(KRADConstants.BUSINESS_OBJECT_CLASS_ATTRIBUTE, KimDocumentRoleMember.class.getName()); 615 props.put(KRADConstants.LOOKUP_ANCHOR, KRADConstants.ANCHOR_TOP_OF_FORM); 616 props.put(KRADConstants.LOOKED_UP_COLLECTION_NAME, KimConstants.KimUIConstants.ROLE_MEMBERS_COLLECTION_NAME); 617 618 String conversionPatttern = "{0}" + KRADConstants.FIELD_CONVERSION_PAIR_SEPARATOR + "{0}"; 619 StringBuilder fieldConversion = new StringBuilder(); 620 fieldConversion.append(MessageFormat.format(conversionPatttern, 621 KimConstants.PrimaryKeyConstants.SUB_ROLE_ID)).append(KRADConstants.FIELD_CONVERSIONS_SEPARATOR); 622 fieldConversion.append(MessageFormat.format(conversionPatttern, 623 KimConstants.PrimaryKeyConstants.ROLE_MEMBER_ID)).append(KRADConstants.FIELD_CONVERSIONS_SEPARATOR); 624 625 props.put(KRADConstants.CONVERSION_FIELDS_PARAMETER, fieldConversion); 626 627 props.put(KimConstants.PrimaryKeyConstants.SUB_ROLE_ID, impdForm.getNewDelegationMember().getRoleBo().getId()); 628 629 props.put(KRADConstants.RETURN_LOCATION_PARAMETER, this.getReturnLocation(request, mapping)); 630 // props.put(KRADConstants.BACK_LOCATION, this.getReturnLocation(request, mapping)); 631 632 props.put(KRADConstants.LOOKUP_AUTO_SEARCH, "Yes"); 633 props.put(KRADConstants.DISPATCH_REQUEST_PARAMETER, KRADConstants.SEARCH_METHOD); 634 635 props.put(KRADConstants.DOC_FORM_KEY, GlobalVariables.getUserSession().addObjectWithGeneratedKey(impdForm)); 636 // props.put(KRADConstants.DOC_NUM, impdForm.getDocument().getDocumentNumber()); 637 638 // TODO: how should this forward be handled 639 String url = UrlFactory.parameterizeUrl(getApplicationBaseUrl() + "/kr/" + KRADConstants.LOOKUP_ACTION, props); 640 641 impdForm.registerEditableProperty("methodToCall"); 642 643 return new ActionForward(url, true); 644 } 645 646 647 public ResponsibilityInternalService getResponsibilityInternalService() { 648 if ( responsibilityInternalService == null ) { 649 responsibilityInternalService = KimImplServiceLocator.getResponsibilityInternalService(); 650 } 651 return responsibilityInternalService; 652 } 653 }