package org.openiam.selfsrvc.profile; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Date; import java.util.Map; import java.util.Set; import java.text.DateFormat; import java.text.SimpleDateFormat; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.openiam.provision.dto.ProvisionUser; import org.springframework.validation.BindException; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.CancellableFormController; import org.springframework.web.servlet.mvc.SimpleFormController; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; 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.user.dto.User; import org.openiam.idm.srvc.user.ws.UserDataWebService; import org.openiam.idm.srvc.user.dto.Supervisor; import org.openiam.idm.srvc.auth.dto.Login; import org.openiam.idm.srvc.auth.ws.LoginDataWebService; import org.openiam.idm.srvc.grp.dto.Group; import org.openiam.idm.srvc.grp.ws.GroupDataWebService; import org.openiam.idm.srvc.org.service.OrganizationDataService; import org.openiam.idm.srvc.prov.request.ws.RequestWebService; import org.openiam.idm.srvc.role.dto.Role; import org.openiam.idm.srvc.role.ws.RoleDataWebService; import org.openiam.idm.srvc.loc.dto.Location; import org.openiam.idm.srvc.loc.ws.LocationDataWebService; import org.openiam.idm.srvc.mngsys.service.ManagedSystemDataService; import org.openiam.provision.service.ProvisionService; import org.openiam.selfsrvc.pswd.PasswordConfiguration; import org.springframework.web.servlet.view.RedirectView; public class ProfileController extends CancellableFormController { protected UserDataWebService userMgr; protected LoginDataWebService loginManager; protected GroupDataWebService groupManager; protected RoleDataWebService roleDataService; protected ManagedSystemDataService managedSysService; protected RequestWebService provRequestService; protected OrganizationDataService orgManager; protected LocationDataWebService locationDataService; protected ReferenceDataService refDataService; protected PasswordConfiguration configuration; protected String resourceName; protected ProvisionService provisionService; String menuGroup; String parentOrgId; private static final Log log = LogFactory.getLog(ProfileController.class); public ProfileController() { super(); } @Override protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { DateFormat df = new SimpleDateFormat("MM/dd/yyyy"); df.setLenient(false); binder.registerCustomEditor(Date.class, new CustomDateEditor(df,true) ); } @Override protected Object formBackingObject(HttpServletRequest request) throws Exception { ProfileCommand profileCmd = new ProfileCommand(); HttpSession session = request.getSession(); String userId = (String)session.getAttribute("userId"); User usr = userMgr.getUserWithDependent(userId, true).getUser(); profileCmd.setUser(usr); List<Supervisor> supVisorList = userMgr.getSupervisors(userId).getSupervisorList(); if (supVisorList != null && !supVisorList.isEmpty()) { Supervisor supervisor = supVisorList.get(0); profileCmd.setSupervisorId(supervisor.getSupervisor().getUserId()); profileCmd.setSupervisorName(supervisor.getSupervisor().getFirstName() + " " + supervisor.getSupervisor().getLastName()); } Address addr = userMgr.getAddressByName(userId, "DEFAULT ADR").getAddress(); EmailAddress email1 = userMgr.getEmailAddressByName(userId, "EMAIL1").getEmailAddress(); EmailAddress email2 = userMgr.getEmailAddressByName(userId, "EMAIL2").getEmailAddress(); EmailAddress email3 = userMgr.getEmailAddressByName(userId, "EMAIL3").getEmailAddress(); Phone deskPhone = userMgr.getPhoneByName(userId, "DESK PHONE").getPhone(); Phone cellPhone = userMgr.getPhoneByName(userId, "CELL PHONE").getPhone(); Phone faxPhone = userMgr.getPhoneByName(userId, "FAX").getPhone(); Phone homePhone = userMgr.getPhoneByName(userId, "HOME PHONE").getPhone(); Phone altCellPhone = userMgr.getPhoneByName(userId, "ALT CELL PHONE").getPhone(); Phone personalPhone = userMgr.getPhoneByName(userId, "PERSONAL PHONE").getPhone(); // get the organizations profileCmd.setOrgList( orgManager.getTopLevelOrganizations() ); // get the divisions profileCmd.setDivisionList( orgManager.allDivisions(this.parentOrgId)); // load the department list profileCmd.setDepartmentList(orgManager.allDepartments(this.parentOrgId)); // get the list of job codes List<ReferenceData> jobCodeList = refDataService.getRefByGroup("JOB_CODE", "en"); profileCmd.setJobCodeList(jobCodeList); // get the list of user type codes List<ReferenceData> userTypeList = refDataService.getRefByGroup("USER_TYPE", "en"); profileCmd.setUserTypeList(userTypeList); //setAddressCommand(usr, addr, profileCmd); setEmailCommand(usr,email1, email2, email3, profileCmd); setPhoneCommand(usr,deskPhone, cellPhone, faxPhone, homePhone, altCellPhone, personalPhone, profileCmd); // load the location list Location[] locationAry = locationDataService.allLocations().getLocationAry(); profileCmd.setLocationAry(locationAry); // get the list of groups and roles that this user belongs to profileCmd.setGroupList( groupManager.getUserInGroups(usr.getUserId()).getGroupList() ); profileCmd.setRoleList( roleDataService.getUserRoles(usr.getUserId()).getRoleList() ); return profileCmd; } @Override protected ModelAndView onCancel(Object command) throws Exception { // return super.onCancel(command); //To change body of overridden methods use File | Settings | File Templates. return new ModelAndView(new RedirectView(getCancelView(),true)); } @Override protected ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response, Object command, BindException errors) throws Exception { System.out.println("ProfileController: onSubmit"); ProfileCommand profileCmd =(ProfileCommand)command; HttpSession session = request.getSession(); String userId = (String)session.getAttribute("userId"); User currentUser = userMgr.getUserWithDependent(userId, true).getUser(); User usr = profileCmd.getUser(); currentUser.updateUser(usr); getPhone(profileCmd, currentUser); getEmail(profileCmd, currentUser); ProvisionUser pUser = new ProvisionUser(currentUser); if (profileCmd.getSupervisorId() != null && profileCmd.getSupervisorId().length() > 0) { User supervisorUser = userMgr.getUserWithDependent(profileCmd.getSupervisorId(),false).getUser(); List<Supervisor> supervisorList = userMgr.getSupervisors(userId).getSupervisorList(); if (supervisorList != null && !supervisorList.isEmpty()) { Supervisor supervisor = supervisorList.get(0); // update an existing supervisor record supervisor.setSupervisor(supervisorUser); pUser.setSupervisor(supervisor); // userMgr.updateSupervisor(supervisor); } else { // new supervisor Supervisor sup = new Supervisor(); sup.setSupervisor(supervisorUser); sup.setEmployee(usr); sup.setStatus("ACTIVE"); pUser.setSupervisor(sup); //userMgr.addSupervisor(sup); } } String login = (String)session.getAttribute("login"); String domain = (String)session.getAttribute("domain"); pUser.setRequestClientIP(request.getRemoteHost()); pUser.setRequestorLogin(login); pUser.setRequestorDomain(domain); provisionService.modifyUser(pUser); ModelAndView mav = new ModelAndView(getSuccessView()); mav.addObject("profileCmd",profileCmd); return mav; } private void setPhoneCommand(User usr, Phone deskPhone, Phone cellPhone, Phone faxPhone, Phone homePhone, Phone altCellPhone, Phone personalPhone, ProfileCommand profile) { if (deskPhone != null) { profile.setWorkAreaCode(deskPhone.getAreaCd()); profile.setWorkPhoneId(deskPhone.getPhoneId()); profile.setWorkPhone(deskPhone.getPhoneNbr()); } if (cellPhone != null) { profile.setCellAreaCode(cellPhone.getAreaCd()); profile.setCellPhoneId(cellPhone.getPhoneId()); profile.setCellPhone(cellPhone.getPhoneNbr()); } if (faxPhone != null) { profile.setFaxAreaCode(faxPhone.getAreaCd()); profile.setFaxPhoneId(faxPhone.getPhoneId()); profile.setFaxPhone(faxPhone.getPhoneNbr()); } if (homePhone != null) { profile.setHomePhoneAreaCode(homePhone.getAreaCd()); profile.setHomePhoneIdr(homePhone.getPhoneId()); profile.setHomePhoneNbr(homePhone.getPhoneNbr()); } if (altCellPhone != null) { profile.setAltCellAreaCode(altCellPhone.getAreaCd()); profile.setAltCellNbrId(altCellPhone.getPhoneId()); profile.setAltCellNbr(altCellPhone.getPhoneNbr()); } if (personalPhone != null) { profile.setPersonalAreaCode(personalPhone.getAreaCd()); profile.setPersonalNbrId(personalPhone.getPhoneId()); profile.setPersonalNbr(personalPhone.getPhoneNbr()); } } private void setEmailCommand(User usr, EmailAddress email1, EmailAddress email2, EmailAddress email3, ProfileCommand profile) { if (email1 != null) { profile.setEmail1(email1.getEmailAddress()); profile.setEmail1Id(email1.getEmailId()); } if (email2 != null) { profile.setEmail2(email2.getEmailAddress()); profile.setEmail2Id(email2.getEmailId()); } if (email3 != null) { profile.setEmail3(email3.getEmailAddress()); profile.setEmail3Id(email3.getEmailId()); } } /* private void setLoginCommand(User usr, String upn, ProfileCommand profile) { try { Login lg = loginManager.getLogin("USR_SEC_DOMAIN", upn ).getPrincipal(); if (lg != null && lg.getId() != null){ profile.setUserPrincipalName(lg.getId().getLogin()); profile.setSecdomain(lg.getId().getManagedSysId()); profile.setManagedSysId(lg.getId().getManagedSysId()); } }catch(Exception e) { e.printStackTrace(); } } */ // methods to get data from a form to a domain object that we can persist private void getEmail(ProfileCommand profileCommand, User usr) { Set<EmailAddress> emailAdrSet = usr.getEmailAddress(); EmailAddress email1 = null, email2 = null, email3 = null; Iterator<EmailAddress> emailIterator = emailAdrSet.iterator(); while (emailIterator.hasNext()) { EmailAddress e = emailIterator.next(); if (e != null) { if (e.getName() != null && e.getName().equalsIgnoreCase("EMAIL1")) { // update e.setEmailAddress(profileCommand.getEmail1()); } if (e.getName() != null && e.getName().equalsIgnoreCase("EMAIL2")) { // update e.setEmailAddress(profileCommand.getEmail2()); } if (e.getName() != null && e.getName().equalsIgnoreCase("EMAIL3")) { // update e.setEmailAddress(profileCommand.getEmail3()); } } } if (!emailExists(emailAdrSet, "EMAIL1")) { // add email email1 = new EmailAddress(); email1.setEmailAddress(profileCommand.getEmail1()); email1.setName("EMAIL1"); email1.setParentId(usr.getUserId()); email1.setParentType(ContactConstants.PARENT_TYPE_USER); emailAdrSet.add(email1); } if (!emailExists(emailAdrSet, "EMAIL2")) { // add email email2 = new EmailAddress(); email2.setEmailAddress(profileCommand.getEmail2()); email2.setName("EMAIL2"); email2.setParentId(usr.getUserId()); email2.setParentType(ContactConstants.PARENT_TYPE_USER); emailAdrSet.add(email2); } if (!emailExists(emailAdrSet, "EMAIL3")) { // add email email3 = new EmailAddress(); email3.setEmailAddress(profileCommand.getEmail3()); email3.setName("EMAIL3"); email3.setParentId(usr.getUserId()); email3.setParentType(ContactConstants.PARENT_TYPE_USER); emailAdrSet.add(email3); } } private boolean phoneExists(Set<Phone> phSet, String name) { Iterator<Phone> phoneIterator = phSet.iterator(); if (phoneIterator == null) { return false; } Phone p = null; while (phoneIterator.hasNext()) { p = phoneIterator.next(); if (p.getName() != null) { if (p.getName().equalsIgnoreCase(name)) { return true; } } } return false; } private boolean emailExists(Set<EmailAddress> emailSet, String name) { Iterator<EmailAddress> emailIterator = emailSet.iterator(); if (emailIterator == null) { return false; } EmailAddress em = null; while (emailIterator.hasNext()) { em = emailIterator.next(); if (em.getName() != null) { if (em.getName().equalsIgnoreCase(name)) { return true; } } } return false; } private void getPhone(ProfileCommand profileCmd, User usr) { Set<Phone> phSet = usr.getPhone(); Phone deskPhone = null, cellPhone = null, faxPhone=null, homePhone = null, altCellPhone = null, personalPhone = null; Iterator<Phone> phoneIterator = phSet.iterator(); while (phoneIterator.hasNext()) { Phone p = phoneIterator.next(); if ( p.getName() != null) { if (p.getName().equalsIgnoreCase("DESK PHONE")) { // update p.setAreaCd(profileCmd.getWorkAreaCode()); p.setPhoneNbr(profileCmd.getWorkPhone()); } if (p.getName().equalsIgnoreCase("CELL PHONE")) { // update p.setAreaCd(profileCmd.getCellAreaCode()); p.setPhoneNbr(profileCmd.getCellPhone()); } if (p.getName().equalsIgnoreCase("FAX")) { // update p.setAreaCd(profileCmd.getFaxAreaCode()); p.setPhoneNbr(profileCmd.getFaxPhone()); } if (p.getName().equalsIgnoreCase("HOME PHONE")) { // update p.setAreaCd(profileCmd.getHomePhoneAreaCode()); p.setPhoneNbr(profileCmd.getHomePhoneNbr()); } if (p.getName().equalsIgnoreCase("ALT CELL PHONE")) { // update p.setAreaCd(profileCmd.getAltCellAreaCode()); p.setPhoneNbr(profileCmd.getAltCellNbr()); } if (p.getName().equalsIgnoreCase("PERSONAL PHONE")) { // update p.setAreaCd(profileCmd.getPersonalAreaCode()); p.setPhoneNbr(profileCmd.getPersonalNbr()); } } } // add obbject if (!phoneExists(phSet, "DESK PHONE")) { // add deskPhone = new Phone(); deskPhone.setAreaCd(profileCmd.getWorkAreaCode()); deskPhone.setPhoneNbr(profileCmd.getWorkPhone()); deskPhone.setDescription("WORK"); deskPhone.setParentType(ContactConstants.PARENT_TYPE_USER); deskPhone.setName("DESK PHONE"); deskPhone.setParentId(usr.getUserId()); phSet.add(deskPhone); } if (!phoneExists(phSet, "CELL PHONE") ) { // add cellPhone = new Phone(); cellPhone.setAreaCd(profileCmd.getCellAreaCode()); cellPhone.setPhoneNbr(profileCmd.getCellPhone()); cellPhone.setDescription("CELL"); cellPhone.setParentType(ContactConstants.PARENT_TYPE_USER); cellPhone.setName("CELL PHONE"); cellPhone.setParentId(usr.getUserId()); phSet.add(cellPhone); } if (!phoneExists(phSet, "FAX")) { // add faxPhone = new Phone(); faxPhone.setAreaCd(profileCmd.getFaxAreaCode()); faxPhone.setPhoneNbr(profileCmd.getFaxPhone()); faxPhone.setDescription("FAX"); faxPhone.setParentType(ContactConstants.PARENT_TYPE_USER); faxPhone.setName("FAX"); faxPhone.setParentId(usr.getUserId()); phSet.add(faxPhone); } if (!phoneExists(phSet, "HOME PHONE")) { // add homePhone = new Phone(); homePhone.setAreaCd(profileCmd.getHomePhoneAreaCode()); homePhone.setPhoneNbr(profileCmd.getHomePhoneNbr()); homePhone.setDescription("HOME"); homePhone.setParentType(ContactConstants.PARENT_TYPE_USER); homePhone.setName("HOME PHONE"); homePhone.setParentId(usr.getUserId()); phSet.add(homePhone); } if (!phoneExists(phSet, "ALT CELL PHONE") ) { // add altCellPhone = new Phone(); altCellPhone.setAreaCd(profileCmd.getAltCellAreaCode()); altCellPhone.setPhoneNbr(profileCmd.getAltCellNbr()); altCellPhone.setDescription("ALT CELL"); altCellPhone.setParentType(ContactConstants.PARENT_TYPE_USER); altCellPhone.setName("ALT CELL PHONE"); altCellPhone.setParentId(usr.getUserId()); altCellPhone.setPhoneId(profileCmd.getAltCellNbrId()); phSet.add(altCellPhone); } if (!phoneExists(phSet, "PERSONAL PHONE") ) { // add personalPhone = new Phone(); personalPhone.setAreaCd(profileCmd.getPersonalAreaCode()); personalPhone.setPhoneNbr(profileCmd.getPersonalNbr()); personalPhone.setDescription("PERSONAL PHONE"); personalPhone.setParentType(ContactConstants.PARENT_TYPE_USER); personalPhone.setName("PERSONAL PHONE"); personalPhone.setParentId(usr.getUserId()); phSet.add(personalPhone); } } private void updateCurrentUser(User currentUser, User updatedUser) { currentUser.updateUser(updatedUser); } public String getMenuGroup() { return menuGroup; } public void setMenuGroup(String menuGroup) { this.menuGroup = menuGroup; } public ManagedSystemDataService getManagedSysService() { return managedSysService; } public void setManagedSysService(ManagedSystemDataService managedSysService) { this.managedSysService = managedSysService; } public OrganizationDataService getOrgManager() { return orgManager; } public void setOrgManager(OrganizationDataService orgManager) { this.orgManager = orgManager; } public String getParentOrgId() { return parentOrgId; } public void setParentOrgId(String parentOrgId) { this.parentOrgId = parentOrgId; } 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 UserDataWebService getUserMgr() { return userMgr; } public void setUserMgr(UserDataWebService userMgr) { this.userMgr = userMgr; } public String getResourceName() { return resourceName; } public void setResourceName(String resourceName) { this.resourceName = resourceName; } public ProvisionService getProvisionService() { return provisionService; } public void setProvisionService(ProvisionService provisionService) { this.provisionService = provisionService; } public LoginDataWebService getLoginManager() { return loginManager; } public void setLoginManager(LoginDataWebService loginManager) { this.loginManager = loginManager; } 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 getLocationDataService() { return locationDataService; } public void setLocationDataService(LocationDataWebService locationDataService) { this.locationDataService = locationDataService; } public RequestWebService getProvRequestService() { return provRequestService; } public void setProvRequestService(RequestWebService provRequestService) { this.provRequestService = provRequestService; } }