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