package org.openiam.selfsrvc.hire; import com.thoughtworks.xstream.XStream; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openiam.base.AttributeOperationEnum; import org.openiam.idm.srvc.audit.dto.IdmAuditLog; import org.openiam.idm.srvc.audit.ws.IdmAuditLogWebDataService; import org.openiam.idm.srvc.cd.dto.ReferenceData; import org.openiam.idm.srvc.cd.service.ReferenceDataService; import org.openiam.idm.srvc.continfo.dto.Address; import org.openiam.idm.srvc.continfo.dto.ContactConstants; import org.openiam.idm.srvc.continfo.dto.EmailAddress; import org.openiam.idm.srvc.continfo.dto.Phone; import org.openiam.idm.srvc.grp.dto.Group; import org.openiam.idm.srvc.grp.ws.GroupDataWebService; import org.openiam.idm.srvc.loc.dto.Location; import org.openiam.idm.srvc.loc.ws.LocationDataWebService; import org.openiam.idm.srvc.menu.ws.NavigatorDataWebService; import org.openiam.idm.srvc.meta.dto.MetadataType; import org.openiam.idm.srvc.meta.ws.MetadataWebService; import org.openiam.idm.srvc.mngsys.dto.ApproverAssociation; import org.openiam.idm.srvc.mngsys.service.ManagedSystemDataService; import org.openiam.idm.srvc.msg.dto.NotificationParam; import org.openiam.idm.srvc.msg.dto.NotificationRequest; import org.openiam.idm.srvc.msg.service.MailService; import org.openiam.idm.srvc.org.dto.Organization; import org.openiam.idm.srvc.org.service.OrganizationDataService; import org.openiam.idm.srvc.policy.service.PolicyDataService; import org.openiam.idm.srvc.prov.request.dto.ProvisionRequest; import org.openiam.idm.srvc.prov.request.dto.RequestApprover; import org.openiam.idm.srvc.prov.request.dto.RequestUser; import org.openiam.idm.srvc.prov.request.ws.RequestWebService; import org.openiam.idm.srvc.res.dto.Resource; import org.openiam.idm.srvc.res.service.ResourceDataService; import org.openiam.idm.srvc.role.dto.Role; import org.openiam.idm.srvc.role.dto.RoleId; import org.openiam.idm.srvc.role.ws.RoleDataWebService; import org.openiam.idm.srvc.secdomain.service.SecurityDomainDataService; import org.openiam.idm.srvc.user.dto.*; import org.openiam.idm.srvc.user.ws.UserDataWebService; import org.openiam.provision.dto.ProvisionUser; import org.openiam.provision.service.ProvisionService; import org.openiam.selfsrvc.AppConfiguration; import org.openiam.selfsrvc.pswd.PasswordConfiguration; import org.openiam.selfsrvc.usradmin.EditUserCommand; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.validation.BindException; import org.springframework.validation.Errors; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.AbstractWizardFormController; import org.springframework.web.servlet.view.RedirectView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.text.SimpleDateFormat; import java.util.*; /** * Controller for the new hire form. * * @author suneet */ public class NewHireController extends AbstractWizardFormController { protected GroupDataWebService groupManager; protected RoleDataWebService roleDataService; protected ResourceDataService resourceDataService; protected SecurityDomainDataService secDomainService; protected OrganizationDataService orgManager; protected LocationDataWebService locationService; protected NavigatorDataWebService navigatorDataService; protected ManagedSystemDataService managedSysService; protected UserDataWebService userMgr; protected MailService mailService; protected MetadataWebService metadataService; protected AppConfiguration appConfiguration; protected RequestWebService provRequestService; protected ReferenceDataService refDataService; protected PasswordConfiguration configuration; protected PolicyDataService policyDataService; protected ProvisionService provisionService; protected IdmAuditLogWebDataService auditService; protected String requestType; protected String cancelView; String defaultDomainId; String menuGroup; private static final Log log = LogFactory.getLog(NewHireController.class); public NewHireController() { super(); } /* ----- overridden methods from the springframework ----------------- */ @Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("MM/dd/yyyy"), true)); } @Override protected void validatePage(Object command, Errors errors, int page) { log.debug("Validate page:" + page); NewHireValidator validator = (NewHireValidator) getValidator(); switch (page) { case 0: validator.validateNewUserType(command, errors); break; case 1: validator.validateNewHireForm(command, errors); break; } } protected ModelAndView processCancel(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { return new ModelAndView(new RedirectView(this.getCancelView(), true)); } @Override protected Object formBackingObject(HttpServletRequest request) throws Exception { List<Resource> resourceList = resourceDataService.getAllResources(); NewHireCommand cmd = new NewHireCommand(); cmd.setResourceList(resourceList); return cmd; } @Override protected Map referenceData(HttpServletRequest request, int page) throws Exception { switch (page) { case 0: return loadUserTypes(request); case 1: return loadUserInformation(request); case 2: return loadAppInformation(request); } return null; } protected ModelAndView processFinish(HttpServletRequest request, HttpServletResponse response, Object command, BindException arg3) throws Exception { log.info("In processFinish.."); NewHireCommand newHireCmd = (NewHireCommand) command; HttpSession session = request.getSession(); String userId = (String) session.getAttribute("userId"); User user = newHireCmd.getUser(); prepareObject(user, userId); List<UserAttribute> attrList = newHireCmd.getAttributeList(); if (attrList != null) { for ( UserAttribute ua : attrList) { ua.setOperation(AttributeOperationEnum.ADD); ua.setUserId(null); ua.setId(null); log.info("Name=" + ua.getName() + "-"+ ua.getValue()); user.getUserAttributes().put(ua.getName(), ua); } } log.info("User=" + user); ProvisionUser pUser = new ProvisionUser(user); if (newHireCmd.getSupervisorId() != null && newHireCmd.getSupervisorId().length() > 0) { User supervisorUser = new User(newHireCmd.getSupervisorId()); Supervisor sup = new Supervisor(); sup.setSupervisor(supervisorUser); sup.setStatus("ACTIVE"); sup.setSupervisor(supervisorUser); pUser.setSupervisor(sup); } // set contact information setEmail(newHireCmd, pUser); setAddress(newHireCmd, pUser); setPhone(newHireCmd, pUser); if (newHireCmd.getGroup() != null && !newHireCmd.getGroup().isEmpty()) { pUser.setMemberOfGroups(getGroupList(newHireCmd, user)); } if (newHireCmd.getRole() != null && !newHireCmd.getRole().isEmpty()) { pUser.setMemberOfRoles(getRoleList(newHireCmd, user)); } log.info("User created. New User Id: " + user.getUserId()); /* serialize the object into xml */ String userAsXML = toXML(pUser); log.info("pUser serialized to XML:" + userAsXML); ProvisionRequest pReq = createRequest(userId, user, userAsXML, pUser); // log the request IdmAuditLog log = new IdmAuditLog("REQUEST-APPROVAL", "NEW HIRE", "SUCCESS", null, configuration.getDefaultSecurityDomain(), userId, (String) request.getSession().getAttribute("login"), null, request.getRemoteAddr()); log.setReqUrl(request.getRequestURL().toString()); log.setRequestId(pReq.getRequestId()); log.setSessionId(request.getSession().getId()); auditService.addLog(log); return new ModelAndView("pub/confirm"); } /*------------- Helper methods ---------------------------*/ private String toXML(ProvisionUser pUser) { XStream xstream = new XStream(); return xstream.toXML(pUser); } private List<Group> getGroupList(NewHireCommand newHireCmd, User user) { List<Group> groupList = new ArrayList<Group>(); String groupId = newHireCmd.getGroup(); Group g = new Group(); g.setGrpId(groupId); groupList.add(g); return groupList; } private List<Role> getRoleList(NewHireCommand newHireCmd, User user) { List<Role> roleList = new ArrayList<Role>(); String cmdRole = newHireCmd.getRole(); /* parse the role */ String domainId = null; String roleId = null; StringTokenizer st = new StringTokenizer(cmdRole, "*"); if (st.hasMoreTokens()) { domainId = st.nextToken(); } if (st.hasMoreElements()) { roleId = st.nextToken(); } RoleId id = new RoleId(domainId , roleId); Role r = new Role(); r.setId(id); roleList.add(r); return roleList; } protected Map loadUserInformation(HttpServletRequest request) { log.info("referenceData called."); // get the organizations List<Organization> orgList = orgManager.getOrganizationList(null, "ACTIVE"); // get the divisions List<Organization> divList = orgManager.allDivisions(null); // load the department list List<Organization> deptList = orgManager.allDepartments(null); // get the list of groups that this user belongs to List<Group> groupList = groupManager.getAllGroups().getGroupList(); // get the list of roles that this user belongs to List<Role> roleList = roleDataService.getAllRoles().getRoleList(); // get the list of job codes List<ReferenceData> jobCodeList = refDataService.getRefByGroup("JOB_CODE", "en"); // get the list of user type codes List<ReferenceData> userTypeList = refDataService.getRefByGroup("USER_TYPE", "en"); // get location list and the address for the user Location[] locationAry = locationService.allLocations().getLocationAry(); Map model = new HashMap(); model.put("orgList", orgList); model.put("divList", divList); model.put("deptList", deptList); model.put("groupList", groupList); model.put("roleList", roleList); model.put("jobCodeList", jobCodeList); model.put("userTypeList", userTypeList); model.put("locationAry", locationAry); return model; } protected Map loadUserTypes(HttpServletRequest request) { log.info("referenceData:loadUserTypes called."); HttpSession session = request.getSession(); log.info("User type category =" + appConfiguration.getUserCategoryType()); MetadataType[] typeAry = metadataService.getTypesInCategory(appConfiguration.getUserCategoryType()).getMetadataTypeAry(); Map model = new HashMap(); model.put("metadataTypeAry",typeAry); return model; } protected Map loadAppInformation(HttpServletRequest request) { Map model = new HashMap(); List<Resource> resourceList = resourceDataService.getResourcesByType(this.configuration.getManagedSystemType()); model.put("resourceList", resourceList); //List<Role> roleList = roleDataService.getAllRoles().getRoleList(); //model.put("appRoleList", roleList); return model; } private void prepareObject(User user, String userId) { // need userId to be null so that persistence layer will generate a uid for the user user.setUserId(null); user.setCreateDate(new Date(System.currentTimeMillis())); user.setCreatedBy(userId); user.setStatus(UserStatusEnum.PENDING_APPROVAL); } private ProvisionRequest createRequest(String userId, User usr, String asXML, ProvisionUser pUser) { String approverId = null; Resource newUserResource = resourceDataService.getResource(requestType); Date curDate = new Date(System.currentTimeMillis()); ProvisionRequest req = new ProvisionRequest(); req.setRequestId(null); req.setRequestorId(userId); req.setStatus("PENDING"); req.setStatusDate(curDate); req.setRequestDate(curDate); req.setRequestType(newUserResource.getResourceId()); req.setRequestReason(newUserResource.getDescription() + " FOR:" + usr.getFirstName() + " " + usr.getLastName()); req.setRequestXML(asXML); if (usr.getCompanyId() != null && usr.getCompanyId().length() > 0) { req.setRequestForOrgId(usr.getCompanyId()); } //req.setManagedResourceId(managedResource.getManagedSysId()); // add a user to the request - this is the person in the New Hire Set<RequestUser> reqUserSet = req.getRequestUsers(); RequestUser reqUser = new RequestUser(); reqUser.setFirstName(usr.getFirstName()); reqUser.setLastName(usr.getLastName()); reqUserSet.add(reqUser); String approverRole = null; String userOrg = null; int applyDelegationFilter = 0; // add the approver to the request object. List<ApproverAssociation> apList = managedSysService.getApproverByRequestType(requestType, 1); if (apList != null) { for (ApproverAssociation ap : apList) { String approverType; String roleDomain = null; if (ap != null) { approverType = ap.getAssociationType(); System.out.println("Approver =" + ap.getApproverRoleId()); if ( ap.getAssociationType().equalsIgnoreCase("SUPERVISOR")) { Supervisor supVisor = pUser.getSupervisor(); approverId = supVisor.getSupervisor().getUserId(); } else if ( ap.getAssociationType().equalsIgnoreCase("ROLE")) { approverId = ap.getApproverRoleId(); roleDomain = ap.getApproverRoleDomain(); approverRole = ap.getApproverRoleId(); if (ap.getApplyDelegationFilter() != null) { applyDelegationFilter = ap.getApplyDelegationFilter().intValue(); } if (usr.getCompanyId() != null) { userOrg = usr.getCompanyId(); } } else { approverId = ap.getApproverUserId(); } RequestApprover reqApprover = new RequestApprover(approverId, ap.getApproverLevel(), ap.getAssociationType(), "PENDING"); reqApprover.setApproverType(approverType); reqApprover.setRoleDomain(roleDomain); req.getRequestApprovers().add(reqApprover); } } } provRequestService.addRequest(req); notifyApprover(req, reqUser, userId, usr, approverRole, userOrg, applyDelegationFilter); return req; } private void notifyApprover(ProvisionRequest pReq, RequestUser reqUser, String requestorId, User usr, String approverRole, String userOrg, int applyDelegationFilter) { // requestor information // User approver = userMgr.getUserWithDependent(approverUserId, false).getUser(); Set<RequestApprover> approverList = pReq.getRequestApprovers(); for ( RequestApprover ra : approverList) { User requestor = userMgr.getUserWithDependent(requestorId, false).getUser(); if (! ra.getApproverType().equalsIgnoreCase("ROLE")) { NotificationRequest request = new NotificationRequest(); request.setUserId(ra.getApproverId()); request.setNotificationType("NEW_PENDING_REQUEST"); request.getParamList().add(new NotificationParam("REQUEST_ID", pReq.getRequestId())); request.getParamList().add(new NotificationParam("REQUEST_REASON", pReq.getRequestReason())); request.getParamList().add(new NotificationParam("REQUESTOR", requestor.getFirstName() + " " + requestor.getLastName())); request.getParamList().add(new NotificationParam("TARGET_USER", reqUser.getFirstName() + " " + reqUser.getLastName())); mailService.sendNotification(request); }else { DelegationFilterSearch search = new DelegationFilterSearch(); search.setRole(approverRole); search.setDelAdmin(applyDelegationFilter); search.setOrgFilter("%" + userOrg + "%"); System.out.println("User Org value =" + userOrg); List<User> roleApprovers = userMgr.searchByDelegationProperties(search).getUserList(); System.out.println("List of approvers for Role: " + roleApprovers); if (roleApprovers != null && !roleApprovers.isEmpty()) { for (User u :roleApprovers) { NotificationRequest request = new NotificationRequest(); // one of the approvers request.setUserId( u.getUserId()) ; request.setNotificationType("NEW_PENDING_REQUEST"); request.getParamList().add(new NotificationParam("REQUEST_ID", pReq.getRequestId())); request.getParamList().add(new NotificationParam("REQUEST_REASON", pReq.getRequestReason())); request.getParamList().add(new NotificationParam("REQUESTOR", usr.getFirstName() + " " + usr.getLastName())); request.getParamList().add(new NotificationParam("TARGET_USER", reqUser.getFirstName() + " " + reqUser.getLastName())); mailService.sendNotification(request); } } } } } private void setEmail(NewHireCommand cmd, ProvisionUser pUser) { String email = cmd.getEmail1(); String emailId = cmd.getEmail1Id(); if (email != null && email.length() > 0) { EmailAddress em = buildEmail(emailId, email,"EMAIL1"); log.info("EmailId 1 = " + em.getEmailId()); pUser.getEmailAddress().add(em); pUser.setEmail(email); } email = cmd.getEmail2(); emailId = cmd.getEmail2Id(); if (email != null && email.length() > 0) { EmailAddress em = buildEmail(emailId, email, "EMAIL2"); log.info("EmailId 2 = " + em.getEmailId()); pUser.getEmailAddress().add(em); } email = cmd.getEmail3(); emailId = cmd.getEmail3Id(); if (email != null && email.length() > 0) { EmailAddress em = buildEmail(emailId, email, "EMAIL3"); pUser.getEmailAddress().add(em); } } private void setPhone(NewHireCommand cmd, ProvisionUser usr) { // Set<Phone> phSet = usr.getPhone(); // add obbject Phone ph = buildPhone( usr, "DESK PHONE", cmd.getWorkAreaCode(), cmd.getWorkPhone()); if (cmd.getWorkPhoneId() != null && cmd.getWorkPhoneId().length() > 0 ) { ph.setPhoneId(cmd.getWorkPhoneId()); } usr.getPhone().add(ph); ph = buildPhone( usr, "CELL PHONE", cmd.getCellAreaCode(), cmd.getCellPhone()); log.info("CELL PHONE: " + cmd.getCellPhoneId()); if (cmd.getCellPhoneId() != null && cmd.getCellPhoneId().length() > 0 ) { ph.setPhoneId(cmd.getCellPhoneId()); } usr.getPhone().add(ph); ph = buildPhone( usr, "FAX", cmd.getFaxAreaCode(), cmd.getFaxPhone() ); if (cmd.getFaxPhoneId() != null && cmd.getFaxPhoneId().length() > 0 ) { ph.setPhoneId(cmd.getFaxPhoneId()); } usr.getPhone().add(ph); ph = buildPhone( usr, "HOME PHONE", cmd.getHomePhoneAreaCode(), cmd.getHomePhoneNbr() ); if (cmd.getHomePhoneIdr() != null && cmd.getHomePhoneIdr().length() > 0 ) { ph.setPhoneId(cmd.getHomePhoneIdr()); } usr.getPhone().add(ph); ph = buildPhone( usr, "ALT CELL PHONE", cmd.getAltCellAreaCode(), cmd.getAltCellNbr() ); if (cmd.getAltCellNbrId() != null && cmd.getAltCellNbrId().length() > 0 ) { ph.setPhoneId(cmd.getAltCellNbrId()); } usr.getPhone().add(ph); ph = buildPhone( usr, "PERSONAL PHONE", cmd.getPersonalAreaCode(), cmd.getPersonalNbr() ); if (cmd.getPersonalNbrId() != null && cmd.getPersonalNbrId().length() > 0 ) { ph.setPhoneId(cmd.getPersonalNbrId()); } usr.getPhone().add(ph); } private void setAddress(NewHireCommand cmd, ProvisionUser pUser) { log.info("setAddress called."); Address adr = new Address(); adr.setAddress1(cmd.getUser().getAddress1()); adr.setAddress2(cmd.getUser().getAddress2()); adr.setBldgNumber(cmd.getUser().getBldgNum()); adr.setCity(cmd.getUser().getCity()); adr.setCountry(cmd.getUser().getCountry()); adr.setState(cmd.getUser().getState()); adr.setStreetDirection(cmd.getUser().getStreetDirection()); adr.setName("DEFAULT ADR"); adr.setParentId(pUser.getUser().getUserId()); adr.setParentType(ContactConstants.PARENT_TYPE_USER); adr.setPostalCd(cmd.getUser().getPostalCd()); pUser.getAddresses().add(adr); } private EmailAddress buildEmail(String emailId, String email, String name) { EmailAddress em = new EmailAddress(); em.setEmailAddress(email); if (emailId != null && emailId.length() > 0) { em.setEmailId(emailId); } em.setParentType(ContactConstants.PARENT_TYPE_USER); em.setName(name); return em; } private Phone buildPhone( ProvisionUser usr, String name, String areaCode, String phone) { Phone ph = new Phone(); ph.setAreaCd(areaCode); ph.setPhoneNbr(phone); ph.setDescription(name); ph.setParentType(ContactConstants.PARENT_TYPE_USER); ph.setName(name); ph.setParentId(usr.getUserId()); return ph; } public String getDefaultDomainId() { return defaultDomainId; } public void setDefaultDomainId(String defaultDomainId) { this.defaultDomainId = defaultDomainId; } public String getMenuGroup() { return menuGroup; } public void setMenuGroup(String menuGroup) { this.menuGroup = menuGroup; } public OrganizationDataService getOrgManager() { return orgManager; } public void setOrgManager(OrganizationDataService orgManager) { this.orgManager = orgManager; } public ReferenceDataService getRefDataService() { return refDataService; } public void setRefDataService(ReferenceDataService refDataService) { this.refDataService = refDataService; } public PasswordConfiguration getConfiguration() { return configuration; } public void setConfiguration(PasswordConfiguration configuration) { this.configuration = configuration; } public ResourceDataService getResourceDataService() { return resourceDataService; } public void setResourceDataService(ResourceDataService resourceDataService) { this.resourceDataService = resourceDataService; } public PolicyDataService getPolicyDataService() { return policyDataService; } public void setPolicyDataService(PolicyDataService policyDataService) { this.policyDataService = policyDataService; } public SecurityDomainDataService getSecDomainService() { return secDomainService; } public void setSecDomainService(SecurityDomainDataService secDomainService) { this.secDomainService = secDomainService; } public ProvisionService getProvisionService() { return provisionService; } public void setProvisionService(ProvisionService provisionService) { this.provisionService = provisionService; } public GroupDataWebService getGroupManager() { return groupManager; } public void setGroupManager(GroupDataWebService groupManager) { this.groupManager = groupManager; } public RoleDataWebService getRoleDataService() { return roleDataService; } public void setRoleDataService(RoleDataWebService roleDataService) { this.roleDataService = roleDataService; } public LocationDataWebService getLocationService() { return locationService; } public void setLocationService(LocationDataWebService locationService) { this.locationService = locationService; } public NavigatorDataWebService getNavigatorDataService() { return navigatorDataService; } public void setNavigatorDataService(NavigatorDataWebService navigatorDataService) { this.navigatorDataService = navigatorDataService; } public IdmAuditLogWebDataService getAuditService() { return auditService; } public void setAuditService(IdmAuditLogWebDataService auditService) { this.auditService = auditService; } public String getRequestType() { return requestType; } public void setRequestType(String requestType) { this.requestType = requestType; } public ManagedSystemDataService getManagedSysService() { return managedSysService; } public void setManagedSysService(ManagedSystemDataService managedSysService) { this.managedSysService = managedSysService; } public UserDataWebService getUserMgr() { return userMgr; } public void setUserMgr(UserDataWebService userMgr) { this.userMgr = userMgr; } public RequestWebService getProvRequestService() { return provRequestService; } public void setProvRequestService(RequestWebService provRequestService) { this.provRequestService = provRequestService; } public String getCancelView() { return cancelView; } public void setCancelView(String cancelView) { this.cancelView = cancelView; } public MailService getMailService() { return mailService; } public void setMailService(MailService mailService) { this.mailService = mailService; } public MetadataWebService getMetadataService() { return metadataService; } public void setMetadataService(MetadataWebService metadataService) { this.metadataService = metadataService; } public AppConfiguration getAppConfiguration() { return appConfiguration; } public void setAppConfiguration(AppConfiguration appConfiguration) { this.appConfiguration = appConfiguration; } }