package org.openiam.webadmin.user;
import java.util.ArrayList;
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.util.ResourceBundle;
import java.text.SimpleDateFormat;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
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.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.base.ws.ResponseStatus;
import org.openiam.idm.srvc.role.dto.Role;
import org.openiam.idm.srvc.role.ws.RoleDataWebService;
import org.openiam.idm.srvc.role.ws.RoleListResponse;
import org.openiam.idm.srvc.user.dto.User;
import org.openiam.idm.srvc.user.ws.UserDataWebService;
import org.openiam.idm.srvc.user.ws.UserResponse;
import org.openiam.idm.srvc.menu.dto.Menu;
import org.openiam.idm.srvc.menu.ws.NavigatorDataWebService;
import org.openiam.idm.srvc.mngsys.service.ManagedSystemDataService;
import org.openiam.provision.dto.ProvisionUser;
import org.openiam.provision.service.ProvisionService;
import org.openiam.webadmin.admin.AppConfiguration;
public class UserRoleController extends CancellableFormController {
protected RoleDataWebService roleDataService;
protected NavigatorDataWebService navigationDataService;
protected String redirectView;
protected ProvisionService provRequestService;
protected UserDataWebService userMgr;
private static final Log log = LogFactory.getLog(UserRoleController.class);
public UserRoleController() {
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 ModelAndView onCancel(Object command) throws Exception {
return new ModelAndView(new RedirectView(getCancelView(),true));
}
@Override
protected Map referenceData(HttpServletRequest request) throws Exception {
log.info("refernceData called.");
Map<Object, Object> dataMap = new HashMap<Object, Object>();
return dataMap;
}
@Override
protected Object formBackingObject(HttpServletRequest request) throws Exception {
UserRoleCommand roleCmd = new UserRoleCommand();
HttpSession session = request.getSession();
String userId = (String)session.getAttribute("userId");
String menuGrp = request.getParameter("menugrp");
String personId = request.getParameter("personId");
// get the level 3 menu
List<Menu> level3MenuList = navigationDataService.menuGroupByUser(menuGrp, userId, "en").getMenuList();
request.setAttribute("menuL3", level3MenuList);
request.setAttribute("personId", personId);
roleCmd.setPerId(personId);
// get the list of roles
List<Role> fullRoleList = new ArrayList<Role>();
List<Role> roleList = roleDataService.getAllRoles().getRoleList();
// get the roles that the user has
RoleListResponse resp = roleDataService.getUserRolesAsFlatList(personId);
if (resp != null && resp.getStatus() == ResponseStatus.SUCCESS) {
// assign the selection of the
List<Role> userRoleList = resp.getRoleList();
// for each role in the main list, check the userRole list to see if its there
for (Role rl : roleList) {
boolean found = false;
for (Role r : userRoleList ) {
if (rl.getId().getRoleId().equalsIgnoreCase(r.getId().getRoleId()) &&
rl.getId().getServiceId().equalsIgnoreCase(r.getId().getServiceId()) ) {
rl.setSelected(true);
fullRoleList.add(rl);
found = true;
}
}
if (!found) {
fullRoleList.add(rl);
}
}
}
roleCmd.setRoleList(roleList);
return roleCmd;
}
@Override
protected ModelAndView onSubmit(HttpServletRequest request,
HttpServletResponse response, Object command, BindException errors) throws Exception {
User usr = null;
List<Role> currentUserRoleList = null;
log.info("UserRoleController: onSubmit");
UserRoleCommand roleCmd =(UserRoleCommand)command;
HttpSession session = request.getSession();
// get the current user object
String personId = roleCmd.getPerId();
UserResponse usrResp = userMgr.getUserWithDependent(personId, true);
if (usrResp.getStatus() == ResponseStatus.SUCCESS ) {
usr = usrResp.getUser();
}
ProvisionUser pUser = new ProvisionUser(usr);
RoleListResponse resp = roleDataService.getUserRolesAsFlatList(personId);
currentUserRoleList = resp.getRoleList();
log.info("Current userRoleList = " + currentUserRoleList);
// - get the list of roles from the form
List<Role> newRoleList = roleCmd.getRoleList();
// show the list of roles that were selected
List<Role> provRoleList = new ArrayList<Role>();
if (newRoleList != null) {
for (Role r : newRoleList) {
if (r.getSelected()) {
log.info("add following role to provRoleList=" +r.getId());
provRoleList.add(r);
}
}
}
// roles to delete
log.info("checking current role list");
if (currentUserRoleList != null) {
log.info("currentUserRoleList is not null");
for ( Role curRl : currentUserRoleList) {
if (!isCurrentRoleInList(curRl, provRoleList)) {
curRl.setOperation(AttributeOperationEnum.DELETE);
log.info("Removing role=" + curRl.getId());
provRoleList.add(curRl);
}
}
}
String login = (String)session.getAttribute("login");
String domain = (String)session.getAttribute("domain");
pUser.setRequestClientIP(request.getRemoteHost());
pUser.setRequestorLogin(login);
pUser.setRequestorDomain(domain);
pUser.setMemberOfRoles(provRoleList);
log.info("modifyUser on ProvisioningService to be called.");
provRequestService.modifyUser(pUser);
return new ModelAndView(new RedirectView(redirectView+"&mode=1", true));
}
private boolean isCurrentRoleInList(Role curRl, List<Role> newRoleList) {
if (newRoleList != null) {
for ( Role r : newRoleList) {
if (r.getId().equals(curRl.getId())) {
log.info("-Role found in currentList=" + curRl.getId());
return true;
}
}
}
log.info("-Role not found in currentList=" + curRl.getId());
return false;
}
public NavigatorDataWebService getNavigationDataService() {
return navigationDataService;
}
public void setNavigationDataService(
NavigatorDataWebService navigationDataService) {
this.navigationDataService = navigationDataService;
}
public RoleDataWebService getRoleDataService() {
return roleDataService;
}
public void setRoleDataService(RoleDataWebService roleDataService) {
this.roleDataService = roleDataService;
}
public String getRedirectView() {
return redirectView;
}
public void setRedirectView(String redirectView) {
this.redirectView = redirectView;
}
public ProvisionService getProvRequestService() {
return provRequestService;
}
public void setProvRequestService(ProvisionService provRequestService) {
this.provRequestService = provRequestService;
}
public UserDataWebService getUserMgr() {
return userMgr;
}
public void setUserMgr(UserDataWebService userMgr) {
this.userMgr = userMgr;
}
}