0,0 → 1,196 |
package ak.hostadmiral.core.action; |
|
import java.util.List; |
import java.util.Collections; |
import java.util.ArrayList; |
import java.util.HashSet; |
|
import javax.servlet.http.HttpServletRequest; |
import javax.servlet.http.HttpServletResponse; |
|
import org.apache.struts.action.Action; |
import org.apache.struts.action.ActionMapping; |
import org.apache.struts.action.ActionForm; |
import org.apache.struts.action.DynaActionForm; |
import org.apache.struts.action.ActionForward; |
import org.apache.struts.action.ActionMessages; |
import org.apache.struts.action.ActionErrors; |
import org.apache.struts.action.ActionError; |
|
import ak.strutsx.RequestUtilsX; |
import ak.strutsx.ErrorHandlerX; |
import ak.backpath.BackPath; |
|
import ak.hostadmiral.util.StringConverter; |
import ak.hostadmiral.util.UserException; |
import ak.hostadmiral.core.CoreResources; |
import ak.hostadmiral.core.model.User; |
import ak.hostadmiral.core.model.UserManager; |
|
public final class UserAction |
extends Action |
implements ErrorHandlerX |
{ |
public void handleErrors(ActionMapping mapping, ActionForm form, |
HttpServletRequest request, HttpServletResponse response) |
throws Exception |
{ |
if("submit".equals(mapping.getParameter())) { |
User user = (User)request.getSession().getAttribute("user"); |
initUserList(request, user); |
|
DynaActionForm theForm = (DynaActionForm)form; |
Long userId; |
User u; |
|
try { |
userId = StringConverter.parseLong(theForm.get("id")); |
} |
catch(NumberFormatException ex) { |
userId = null; |
} |
|
if(userId == null) |
u = UserManager.getInstance().create(user); |
else |
u = UserManager.getInstance().get(user, userId); |
|
request.setAttribute("u", u); |
} |
} |
|
public ActionForward execute(ActionMapping mapping, ActionForm form, |
HttpServletRequest request, HttpServletResponse response) |
throws Exception |
{ |
User user = (User)request.getSession().getAttribute("user"); |
|
if("list".equals(mapping.getParameter())) { |
List list = new ArrayList(UserManager.getInstance().listUsers(user)); |
Collections.sort(list, UserManager.LOGIN_COMPARATOR); |
request.setAttribute("users", list); |
|
return mapping.findForward("default"); |
} |
else if("edit".equals(mapping.getParameter())) { |
DynaActionForm theForm = (DynaActionForm)form; |
Long userId = StringConverter.parseLong(theForm.get("id")); |
User u; |
DynaActionForm showForm = (DynaActionForm)RequestUtilsX.populateActionForm( |
this, request, "ak.hostadmiral.core.form.UserEditForm"); |
|
if(userId == null) { |
u = UserManager.getInstance().create(user); |
showForm.set("enabled", new Boolean(true)); |
} |
else { |
u = UserManager.getInstance().get(user, userId); |
showForm.set("login", u.getLogin()); |
if(u.getBoss() != null) |
showForm.set("boss", StringConverter.toString(u.getBoss().getId())); |
showForm.set("superuser", u.getSuperuser()); |
showForm.set("enabled", u.getEnabled()); |
showForm.set("comment", u.getComment()); |
} |
|
initUserList(request, user); |
request.setAttribute("u", u); |
if(u.editableBy(user)) |
return mapping.findForward("default"); |
else |
return mapping.findForward("view"); |
} |
else if("deleting".equals(mapping.getParameter())) { |
DynaActionForm theForm = (DynaActionForm)form; |
Long userId = StringConverter.parseLong(theForm.get("id")); |
User u = UserManager.getInstance().get(user, userId); |
|
request.setAttribute("action", "/user/delete.do"); |
request.setAttribute("object", u); |
request.setAttribute("cascade", |
UserManager.getInstance().beforeDelete(user, u, new HashSet())); |
|
return mapping.findForward("default"); |
} |
else if("delete".equals(mapping.getParameter())) { |
DynaActionForm theForm = (DynaActionForm)form; |
Long userId = StringConverter.parseLong(theForm.get("id")); |
User u = UserManager.getInstance().get(user, userId); |
request.setAttribute("u", u); |
|
if(u.equals(user)) { |
handleErrors(mapping, form, request, response); |
throw new UserException(CoreResources.DELETE_ME_SELF); |
} |
|
// FIXME: invalidate session of deleted user if it is logged in |
// FIXME: if two admins delete each other at the same time |
|
UserManager.getInstance().delete(user, u); |
response.sendRedirect(BackPath.findBackPath(request).getBackwardUrl()); |
return null; |
} |
else if("submit".equals(mapping.getParameter())) { |
DynaActionForm theForm = (DynaActionForm)form; |
Long userId = StringConverter.parseLong(theForm.get("id")); |
User u; |
String password = (String)theForm.get("password"); |
|
if(userId == null) { |
if(password == null || password.equals("")) { |
handleErrors(mapping, form, request, response); |
throw new UserException(CoreResources.PASSWORD_REQUIRED); |
} |
|
u = UserManager.getInstance().create(user); |
} |
else { |
u = UserManager.getInstance().get(user, userId); |
} |
request.setAttribute("u", u); |
|
String login = (String)theForm.get("login"); |
if(UserManager.getInstance().loginExists(user, u, login)) { |
handleErrors(mapping, form, request, response); |
throw new UserException(CoreResources.NONUNIQUE_USER_LOGIN); |
} |
u.setLogin(user, login); |
|
if(u.editableBy(user)) { |
Long bossId = StringConverter.parseLong(theForm.get("boss")); |
if(bossId == null) |
u.setBoss(user, null); |
else |
u.setBoss(user, UserManager.getInstance().get(user, bossId)); |
|
u.setEnabled(user, (Boolean)theForm.get("enabled")); |
u.setComment(user, (String)theForm.get("comment")); |
} |
|
if(u.mayChangeSuperuser(user)) |
u.setSuperuser(user, (Boolean)theForm.get("superuser")); |
|
if(password != null && !password.equals("") |
&& u.editableBy(user) // more strong condition, because normal |
&& u.mayChangePassword(user)) // user have to enter first the old password |
{ |
u.setPassword(user, password); |
} |
|
UserManager.getInstance().save(user, u); |
response.sendRedirect(BackPath.findBackPath(request).getBackwardUrl()); |
return null; |
} |
else { |
throw new Exception("unknown mapping parameter"); |
} |
} |
|
private void initUserList(HttpServletRequest request, User user) |
throws Exception |
{ |
List list = new ArrayList(UserManager.getInstance().listUsers(user)); |
Collections.sort(list, UserManager.LOGIN_COMPARATOR); |
request.setAttribute("users", list); |
} |
} |