package org.openiam.webadmin.user;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Date;
import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
import java.text.SimpleDateFormat;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.openiam.base.ExtendController;
import org.openiam.idm.srvc.role.dto.UserRole;
import org.openiam.provision.resp.ProvisionUserResponse;
import org.openiam.provision.service.AsynchUserProvisionService;
import org.openiam.script.ScriptFactory;
import org.openiam.script.ScriptIntegration;
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 org.springframework.beans.propertyeditors.CustomDateEditor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openiam.base.AttributeOperationEnum;
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.Supervisor;
import org.openiam.idm.srvc.user.dto.User;
import org.openiam.idm.srvc.user.dto.UserAttribute;
import org.openiam.idm.srvc.user.dto.UserStatusEnum;
import org.openiam.idm.srvc.grp.dto.Group;
import org.openiam.idm.srvc.grp.ws.GroupDataWebService;
import org.openiam.idm.srvc.org.dto.Organization;
import org.openiam.idm.srvc.org.service.OrganizationDataService;
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.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.webadmin.admin.AppConfiguration;
import org.openiam.provision.dto.ProvisionUser;
import org.openiam.provision.service.ProvisionService;
/**
* Controller for the new hire form.
* @author suneet
*
*/
public class NewUserController extends AbstractWizardFormController {
protected GroupDataWebService groupManager;
protected RoleDataWebService roleDataService;
protected NavigatorDataWebService navigatorDataService;
protected LocationDataWebService locationService;
protected AsynchUserProvisionService provService;
protected OrganizationDataService orgManager;
protected ReferenceDataService refDataService;
protected ResourceDataService resourceDataService;
protected SecurityDomainDataService secDomainService;
protected MetadataWebService metadataService;
protected AppConfiguration configuration;
protected String redirectView;
protected UserStatusEnum newUserStatus;
protected String scriptEngine;
protected String extendController;
private static final Log log = LogFactory.getLog(NewUserController.class);
public NewUserController() {
super();
}
@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);
NewUserValidator validator = (NewUserValidator)getValidator();
switch (page) {
case 0:
validator.validateNewUserType(command, errors);
break;
case 1:
validator.validateNewUserForm(command, errors);
break;
}
}
protected ModelAndView processFinish(HttpServletRequest request,
HttpServletResponse response, Object command, BindException arg3)
throws Exception {
log.info("In processFinish..");
NewUserCommand newUserCmd =(NewUserCommand)command;
HttpSession session = request.getSession();
String userId = (String)session.getAttribute("userId");
User user = newUserCmd.getUser();
prepareObject(user, userId);
log.info("User=" + user);
// add the attributes
List<UserAttribute> attrList = newUserCmd.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);
}
}
ProvisionUser pUser = new ProvisionUser(user);
log.info("Show in search value=" + pUser.getShowInSearch());
log.info("Alternate contactid=" + pUser.getAlternateContactId());
// set the supervisor
if (newUserCmd.getSupervisorId() != null && newUserCmd.getSupervisorId().length() > 0) {
User supervisorUser = new User(newUserCmd.getSupervisorId());
Supervisor sup = new Supervisor();
sup.setSupervisor(supervisorUser);
sup.setStatus("ACTIVE");
sup.setSupervisor(supervisorUser);
pUser.setSupervisor(sup);
}
// add contact information
pUser.getAddresses().add(getAddress(newUserCmd));
addPhoneToUser(pUser, newUserCmd);
addEmailToUser(pUser, newUserCmd);
// pUser.getPhone().add(getPhone(newUserCmd));
// pUser.getEmailAddress().add(getEmailAddress(newUserCmd));
// add group
if (newUserCmd.getGroup() != null && !newUserCmd.getGroup().isEmpty()) {
pUser.setMemberOfGroups(getGroupList(newUserCmd, user));
}
// add role
if (newUserCmd.getRole() != null && !newUserCmd.getRole().isEmpty()) {
pUser.setMemberOfRoles(getRoleList(newUserCmd, user));
}
// update the type
if (user.getMetadataTypeId().equalsIgnoreCase("-")){
user.setMetadataTypeId(null);
}
if (newUserCmd.isNotifyUserViaEmail()) {
pUser.setEmailCredentialsToNewUsers(true);
}else{
pUser.setEmailCredentialsToNewUsers(false);
}
if (newUserCmd.isNotifySupervisorViaEmail()) {
pUser.setEmailCredentialsToSupervisor(true);
}else {
pUser.setEmailCredentialsToSupervisor(false);
}
String login = (String)session.getAttribute("login");
String domain = (String)session.getAttribute("domainId");
pUser.setRequestClientIP(request.getRemoteHost());
pUser.setRequestorLogin(login);
pUser.setRequestorDomain(domain);
try {
ScriptIntegration se = null;
se = ScriptFactory.createModule(scriptEngine);
ExtendController extCmd = (ExtendController)se.instantiateClass(null, extendController);
Map<String,Object> controllerObj = new HashMap<String,Object>();
controllerObj.put("user", pUser);
// provision user
if (extCmd.pre("ADD", controllerObj, null) == ExtendController.SUCCESS_CONTINUE) {
provService.addUser(pUser);
}
}catch(Exception e) {
e.printStackTrace();
}
return new ModelAndView(new RedirectView(redirectView+"&mode=1", true));
}
private Address getAddress(NewUserCommand newUserCmd) {
Address adr = new Address();
adr.setAddress1(newUserCmd.getUser().getAddress1());
adr.setAddress2(newUserCmd.getUser().getAddress2());
adr.setAddress3(newUserCmd.getUser().getAddress3());
adr.setAddress4(newUserCmd.getUser().getAddress4());
adr.setAddress5(newUserCmd.getUser().getAddress5());
adr.setBldgNumber(newUserCmd.getUser().getBldgNum());
adr.setStreetDirection(newUserCmd.getUser().getStreetDirection());
adr.setCity(newUserCmd.getUser().getCity());
adr.setState(newUserCmd.getUser().getState());
adr.setPostalCd(newUserCmd.getUser().getPostalCd());
return adr;
}
private void addPhoneToUser (ProvisionUser usr, NewUserCommand newHireCmd) {
Set<Phone> phSet = usr.getPhone();
Phone deskPhone = new Phone();
deskPhone.setAreaCd(newHireCmd.getUser().getAreaCd());
deskPhone.setPhoneNbr(newHireCmd.getUser().getPhoneNbr());
deskPhone.setParentType(ContactConstants.PARENT_TYPE_USER);
deskPhone.setName("DESK PHONE");
deskPhone.setParentId(usr.getUserId());
Phone cellPhone = new Phone();
cellPhone.setAreaCd(newHireCmd.getCellAreaCode());
cellPhone.setPhoneNbr(newHireCmd.getCellPhone());
cellPhone.setParentType(ContactConstants.PARENT_TYPE_USER);
cellPhone.setName("CELL PHONE");
cellPhone.setParentId(usr.getUserId());
Phone faxPhone = new Phone();
faxPhone.setAreaCd(newHireCmd.getFaxAreaCode());
faxPhone.setPhoneNbr(newHireCmd.getFaxPhone());
faxPhone.setDescription("FAX");
faxPhone.setParentType(ContactConstants.PARENT_TYPE_USER);
faxPhone.setName("FAX");
faxPhone.setParentId(usr.getUserId());
Phone homePhone = new Phone();
homePhone.setAreaCd(newHireCmd.getHomePhoneAreaCode());
homePhone.setPhoneNbr(newHireCmd.getHomePhoneNbr());
homePhone.setParentType(ContactConstants.PARENT_TYPE_USER);
homePhone.setName("HOME PHONE");
homePhone.setParentId(usr.getUserId());
Phone altCellPhone = new Phone();
altCellPhone.setAreaCd(newHireCmd.getAltCellAreaCode());
altCellPhone.setPhoneNbr(newHireCmd.getAltCellNbr());
altCellPhone.setParentType(ContactConstants.PARENT_TYPE_USER);
altCellPhone.setName("ALT CELL PHONE");
altCellPhone.setParentId(usr.getUserId());
Phone personalPhone = new Phone();
personalPhone.setAreaCd(newHireCmd.getPersonalAreaCode());
personalPhone.setPhoneNbr(newHireCmd.getPersonalNbr());
personalPhone.setDescription("PERSONAL PHONE");
personalPhone.setParentType(ContactConstants.PARENT_TYPE_USER);
personalPhone.setName("PERSONAL PHONE");
personalPhone.setParentId(usr.getUserId());
phSet.add(deskPhone);
phSet.add(cellPhone);
phSet.add(faxPhone);
phSet.add(homePhone);
phSet.add(altCellPhone);
phSet.add(personalPhone);
}
private void addEmailToUser(ProvisionUser usr, NewUserCommand newHireCmd) {
Set<EmailAddress> emailAdrSet = usr.getEmailAddress();
EmailAddress email1 = new EmailAddress();
email1.setEmailAddress(newHireCmd.getUser().getEmail());
email1.setParentId(usr.getUserId());
email1.setName("EMAIL1");
email1.setParentType(ContactConstants.PARENT_TYPE_USER);
usr.setEmail(newHireCmd.getUser().getEmail());
EmailAddress email2 = new EmailAddress();
email2.setEmailAddress(newHireCmd.getEmail2());
email2.setParentId(usr.getUserId());
email2.setName("EMAIL2");
email2.setParentType(ContactConstants.PARENT_TYPE_USER);
emailAdrSet.add(email1);
emailAdrSet.add(email2);
}
private EmailAddress getEmailAddress(NewUserCommand newUserCmd) {
EmailAddress email = new EmailAddress();
email.setName("EMAIL1");
email.setEmailAddress(newUserCmd.getUser().getEmail());
return email;
}
private List<Group> getGroupList(NewUserCommand 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(NewUserCommand 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 ModelAndView processCancel(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors)
throws Exception {
Map model = new HashMap();
model.put("message", "Request to reset the password has been canceled");
return new ModelAndView("pub/cancel");
}
@Override
protected Object formBackingObject(HttpServletRequest request) throws Exception {
List<Resource> resourceList = resourceDataService.getResourcesByType(this.configuration.getManagedSystemType());
NewUserCommand cmd = new NewUserCommand();
cmd.setResourceList(resourceList);
return cmd;
}
@Override
protected Map referenceData(HttpServletRequest request, int page) throws Exception {
log.info("in referenceData");
switch (page) {
case 0:
return loadUserTypes(request);
case 1:
return loadUserInformation(request);
}
return null;
}
protected Map loadUserTypes(HttpServletRequest request) {
log.info("referenceData:loadUserTypes called.");
HttpSession session = request.getSession();
log.info("User type category =" + configuration.getUserCategoryType());
MetadataType[] typeAry = metadataService.getTypesInCategory(configuration.getUserCategoryType()).getMetadataTypeAry();
Map model = new HashMap();
model.put("metadataTypeAry",typeAry);
return model;
}
protected Map loadUserInformation(HttpServletRequest request) {
log.info("referenceData:loadUserInformation called.");
HttpSession session = request.getSession();
String userId = (String)session.getAttribute("userId");
// get the organizations
List<Organization> orgList = orgManager.getOrganizationList(null,"ACTIVE"); //orgManager.getTopLevelOrganizations();
// 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;
}
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(newUserStatus);
}
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 NavigatorDataWebService getNavigatorDataService() {
return navigatorDataService;
}
public void setNavigatorDataService(NavigatorDataWebService navigatorDataService) {
this.navigatorDataService = navigatorDataService;
}
public OrganizationDataService getOrgManager() {
return orgManager;
}
public void setOrgManager(OrganizationDataService orgManager) {
this.orgManager = orgManager;
}
public LocationDataWebService getLocationService() {
return locationService;
}
public void setLocationService(LocationDataWebService locationService) {
this.locationService = locationService;
}
public ReferenceDataService getRefDataService() {
return refDataService;
}
public void setRefDataService(ReferenceDataService refDataService) {
this.refDataService = refDataService;
}
public AppConfiguration getConfiguration() {
return configuration;
}
public void setConfiguration(AppConfiguration configuration) {
this.configuration = configuration;
}
public ResourceDataService getResourceDataService() {
return resourceDataService;
}
public void setResourceDataService(ResourceDataService resourceDataService) {
this.resourceDataService = resourceDataService;
}
public SecurityDomainDataService getSecDomainService() {
return secDomainService;
}
public void setSecDomainService(SecurityDomainDataService secDomainService) {
this.secDomainService = secDomainService;
}
public String getRedirectView() {
return redirectView;
}
public void setRedirectView(String redirectView) {
this.redirectView = redirectView;
}
public MetadataWebService getMetadataService() {
return metadataService;
}
public void setMetadataService(MetadataWebService metadataService) {
this.metadataService = metadataService;
}
public UserStatusEnum getNewUserStatus() {
return newUserStatus;
}
public void setNewUserStatus(UserStatusEnum newUserStatus) {
this.newUserStatus = newUserStatus;
}
public String getScriptEngine() {
return scriptEngine;
}
public void setScriptEngine(String scriptEngine) {
this.scriptEngine = scriptEngine;
}
public String getExtendController() {
return extendController;
}
public void setExtendController(String extendController) {
this.extendController = extendController;
}
public AsynchUserProvisionService getProvService() {
return provService;
}
public void setProvService(AsynchUserProvisionService provService) {
this.provService = provService;
}
}