package org.openiam.selfsrvc.hire;
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.text.SimpleDateFormat;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.openiam.idm.srvc.user.dto.*;
import org.openiam.selfsrvc.usradmin.DelegationFilterHelper;
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.beans.propertyeditors.CustomDateEditor;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openiam.base.ws.ResponseStatus;
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.service.UserDataService;
import org.openiam.idm.srvc.user.ws.UserDataWebService;
import org.openiam.idm.srvc.user.ws.UserResponse;
import org.openiam.idm.srvc.audit.dto.IdmAuditLog;
import org.openiam.idm.srvc.audit.ws.IdmAuditLogWebDataService;
import org.openiam.idm.srvc.auth.dto.LoginId;
import org.openiam.idm.srvc.auth.dto.Login;
import org.openiam.idm.srvc.auth.login.LoginDataService;
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.policy.service.PolicyDataService;
import org.openiam.idm.srvc.prov.request.dto.ProvisionRequest;
import org.openiam.idm.srvc.prov.request.dto.ProvisioningConstants;
import org.openiam.idm.srvc.prov.request.dto.RequestUser;
import org.openiam.idm.srvc.prov.request.service.RequestDataService;
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.loc.dto.Location;
import org.openiam.idm.srvc.loc.ws.LocationDataWebService;
import org.openiam.idm.srvc.menu.ws.NavigatorDataWebService;
import org.openiam.idm.srvc.mngsys.dto.ManagedSys;
import org.openiam.idm.srvc.mngsys.service.ManagedSystemDataService;
import org.openiam.provision.dto.ProvisionUser;
import org.openiam.provision.resp.ProvisionUserResponse;
import org.openiam.provision.service.ProvisionService;
import org.openiam.selfsrvc.pswd.PasswordConfiguration;
import com.thoughtworks.xstream.XStream;
/**
* Controller for the NewUserNoAppController form. This New User form does not have an approval step. The user is created automatically.
* @author suneet
*
*/
public class NewUserNoAppController 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 RequestWebService provRequestService;
protected ReferenceDataService refDataService;
protected PasswordConfiguration configuration;
protected PolicyDataService policyDataService;
protected ProvisionService provisionService;
protected IdmAuditLogWebDataService auditService;
String defaultDomainId;
String menuGroup;
private static final Log log = LogFactory.getLog(NewUserNoAppController.class);
public NewUserNoAppController() {
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);
NewUserNoAppValidator validator = (NewUserNoAppValidator)getValidator();
switch (page) {
case 0:
validator.validateNewHireForm(command, errors);
break;
case 1:
//validator.validateUnlockVerifyIdentity(command, errors);
break;
}
}
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 {
NewUserNoAppCommand cmd = new NewUserNoAppCommand();
//cmd.setResourceList(resourceList);
return cmd;
}
@Override
protected Map referenceData(HttpServletRequest request, int page) throws Exception {
switch (page) {
case 0:
return loadUserInformation(request);
case 1:
return loadAppInformation(request);
}
return null;
}
protected ModelAndView processFinish(HttpServletRequest request,
HttpServletResponse response, Object command, BindException arg3)
throws Exception {
log.info("In processFinish..");
NewUserNoAppCommand newHireCmd =(NewUserNoAppCommand)command;
HttpSession session = request.getSession();
String userId = (String)session.getAttribute("userId");
User user = newHireCmd.getUser();
prepareObject(user, userId);
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);
}
/* should be created by the service based on the policies */
// pUser.setPrincipalList(getPrincipalList(newHireCmd,user));
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());
this.provisionService.addUser(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.setSessionId(request.getSession().getId());
auditService.addLog(log);
return new ModelAndView("pub/confirm");
}
/*------------- Helper methods ---------------------------*/
private List<Group> getGroupList(NewUserNoAppCommand 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(NewUserNoAppCommand newHireCmd, User user) {
List<Role> roleList = new ArrayList<Role>();
String roleId = newHireCmd.getRole();
RoleId id = new RoleId(configuration.getDefaultSecurityDomain() , roleId);
Role r = new Role();
r.setId(id);
roleList.add(r);
return roleList;
}
private List<Organization> getFilteredList(List<String> idList, List<Organization> orgList) {
System.out.println("Building filter org list");
if (orgList == null) {
return null;
}
if (idList == null) {
return orgList;
}
List<Organization> newOrgList = new ArrayList<Organization>();
for (Organization org : orgList) {
if (idList.contains( org.getOrgId())) {
newOrgList.add(org);
}else {
}
}
System.out.println("Org List =" + newOrgList);
return newOrgList;
}
protected Map loadUserInformation(HttpServletRequest request) {
log.info("referenceData called.");
HttpSession session = request.getSession();
User usr = (User)session.getAttribute("userObj");
List<Organization> orgList = null;
List<Organization> divList = null;
List<Organization> deptList = null;
List<Role> roleList = null;
if (usr.getDelAdmin() != null && usr.getDelAdmin().intValue() == 0) {
Map<String, UserAttribute> attrMap = usr.getUserAttributes();
orgList = getFilteredList(DelegationFilterHelper.getOrgIdFilterFromString(attrMap), orgManager.getOrganizationList(null,"ACTIVE")) ;
divList = getFilteredList(DelegationFilterHelper.getDivisionFilterFromString(attrMap), orgManager.allDivisions(null) ) ;
deptList = getFilteredList(DelegationFilterHelper.getDeptFilterFromString(attrMap), orgManager.allDepartments(null) ) ;
// filter the role
List<String> roleIdList = DelegationFilterHelper.getRoleFilterFromString(attrMap);
List<Role> completeRoleList = roleDataService.getAllRoles().getRoleList();
if (roleIdList == null) {
roleList = completeRoleList;
}else {
// apply filter
roleList = new ArrayList<Role>();
for (Role r : completeRoleList) {
System.out.println("Role id = " + r.getId().getRoleId());
if (roleIdList.contains(r.getId().getServiceId() + "*" + r.getId().getRoleId())) {
System.out.println("Role found and added to roleList");
roleList.add(r);
}
}
}
}else {
orgList = orgManager.getTopLevelOrganizations();
// get the divisions
divList = orgManager.allDivisions(null);
// load the department list
deptList = orgManager.allDepartments(null);
roleList = roleDataService.getAllRoles().getRoleList();
}
// 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
// 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 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_INITIAL_LOGIN);
}
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 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;
}
}