PageRenderTime 89ms CodeModel.GetById 35ms RepoModel.GetById 0ms app.codeStats 0ms

/src/main/java/br/apolo/web/controller/UserController.java

https://bitbucket.org/pbeltrani/apolo-webdiag
Java | 355 lines | 253 code | 91 blank | 11 comment | 32 complexity | 095060b2d04dcfb3bb0fcc9e89591d58 MD5 | raw file
  1. package br.apolo.web.controller;
  2. import java.util.Date;
  3. import java.util.List;
  4. import java.util.Set;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.validation.Valid;
  7. import net.sf.json.JSONObject;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.beans.propertyeditors.CustomCollectionEditor;
  10. import org.springframework.context.support.DefaultMessageSourceResolvable;
  11. import org.springframework.security.access.prepost.PreAuthorize;
  12. import org.springframework.stereotype.Controller;
  13. import org.springframework.validation.BindingResult;
  14. import org.springframework.validation.ObjectError;
  15. import org.springframework.web.bind.WebDataBinder;
  16. import org.springframework.web.bind.annotation.InitBinder;
  17. import org.springframework.web.bind.annotation.ModelAttribute;
  18. import org.springframework.web.bind.annotation.PathVariable;
  19. import org.springframework.web.bind.annotation.RequestMapping;
  20. import org.springframework.web.bind.annotation.RequestMethod;
  21. import org.springframework.web.bind.annotation.RequestParam;
  22. import org.springframework.web.bind.annotation.ResponseBody;
  23. import org.springframework.web.servlet.ModelAndView;
  24. import br.apolo.business.model.SearchResult;
  25. import br.apolo.business.service.UserGroupService;
  26. import br.apolo.business.service.UserService;
  27. import br.apolo.common.util.MessageBundle;
  28. import br.apolo.data.model.User;
  29. import br.apolo.security.SecuredEnum;
  30. import br.apolo.security.UserPermission;
  31. import br.apolo.web.enums.Navigation;
  32. @Controller
  33. @RequestMapping(value = "/user")
  34. public class UserController extends BaseController<User> {
  35. @Autowired
  36. UserService userService;
  37. @Autowired
  38. UserGroupService userGroupService;
  39. @PreAuthorize("isAuthenticated()")
  40. @RequestMapping(value = "", method = RequestMethod.GET)
  41. public ModelAndView index(HttpServletRequest request) {
  42. breadCrumbService.addNode(MessageBundle.getMessageBundle("breadcrumb.user"), 1, request);
  43. ModelAndView mav = new ModelAndView(Navigation.USER_INDEX.getPath());
  44. mav.addObject("user", userService.getAuthenticatedUser());
  45. mav.addObject("readOnly", true);
  46. return mav;
  47. }
  48. @PreAuthorize("isAuthenticated()")
  49. @RequestMapping(value = "change-password", method = RequestMethod.GET)
  50. public ModelAndView changePassword(HttpServletRequest request) {
  51. breadCrumbService.addNode(MessageBundle.getMessageBundle("breadcrumb.user.changepassword"), 1, request);
  52. ModelAndView mav = new ModelAndView(Navigation.USER_CHANGE_PASSWORD.getPath());
  53. mav.addObject("user", userService.getAuthenticatedUser());
  54. mav.addObject("readOnly", true);
  55. mav.addObject("changePassword", true);
  56. return mav;
  57. }
  58. @PreAuthorize("isAuthenticated()")
  59. @RequestMapping(value = "change-password-save", method = RequestMethod.POST)
  60. public ModelAndView changePasswordSave(@ModelAttribute("user") User user, HttpServletRequest request, @RequestParam(defaultValue = "") String passwordConfirmation) {
  61. ModelAndView mav = index(request);
  62. if (entityHasErrors(user, true, passwordConfirmation)) {
  63. mav.setViewName(getRedirectionPath(request, Navigation.USER_CHANGE_PASSWORD, Navigation.USER_CHANGE_PASSWORD));
  64. mav.addObject("user", userService.getAuthenticatedUser());
  65. mav.addObject("readOnly", true);
  66. mav.addObject("changePassword", true);
  67. mav.addObject("error", true);
  68. StringBuilder message = new StringBuilder();
  69. message.append(additionalValidation(user, true, passwordConfirmation));
  70. mav.addObject("message", message.toString());
  71. return mav;
  72. }
  73. if (user != null) {
  74. User dbuser = userService.find(user.getId());
  75. dbuser.setPassword(user.getPassword());
  76. userService.save(dbuser, true);
  77. }
  78. return mav;
  79. }
  80. @SecuredEnum(UserPermission.USER_CREATE)
  81. @RequestMapping(value = "new", method = RequestMethod.GET)
  82. public ModelAndView create(HttpServletRequest request) {
  83. breadCrumbService.addNode(MessageBundle.getMessageBundle("breadcrumb.user.new"), 1, request);
  84. ModelAndView mav = new ModelAndView(Navigation.USER_NEW.getPath());
  85. User user = new User();
  86. user.setCreatedBy(userService.getAuthenticatedUser());
  87. user.setCreationDate(new Date());
  88. user.setLastUpdatedBy(userService.getAuthenticatedUser());
  89. user.setLastUpdateDate(new Date());
  90. mav.addObject("user", user);
  91. mav.addObject("groupList", userGroupService.list());
  92. mav.addObject("readOnly", false);
  93. return mav;
  94. }
  95. @SecuredEnum(UserPermission.USER_EDIT)
  96. @RequestMapping(value = "edit/{id}", method = RequestMethod.GET)
  97. public ModelAndView edit(@PathVariable Long id, HttpServletRequest request) {
  98. breadCrumbService.addNode(MessageBundle.getMessageBundle("breadcrumb.user.edit"), 2, request);
  99. ModelAndView mav = new ModelAndView(Navigation.USER_EDIT.getPath());
  100. User user = userService.find(id);
  101. user.setLastUpdatedBy(userService.getAuthenticatedUser());
  102. user.setLastUpdateDate(new Date());
  103. mav.addObject("user", user);
  104. mav.addObject("groupList", userGroupService.list());
  105. mav.addObject("readOnly", false);
  106. mav.addObject("editing", true);
  107. return mav;
  108. }
  109. @SecuredEnum(UserPermission.USER_LIST)
  110. @RequestMapping(value = "view/{id}", method = RequestMethod.GET)
  111. public ModelAndView view(@PathVariable Long id, HttpServletRequest request) {
  112. breadCrumbService.addNode(MessageBundle.getMessageBundle("breadcrumb.user"), 2, request);
  113. ModelAndView mav = new ModelAndView(Navigation.USER_VIEW.getPath());
  114. User user = userService.find(id);
  115. mav.addObject("user", user);
  116. mav.addObject("readOnly", true);
  117. return mav;
  118. }
  119. @Override
  120. @SecuredEnum(UserPermission.USER_REMOVE)
  121. @RequestMapping(value = "remove/{id}", method = RequestMethod.GET)
  122. public @ResponseBody String remove(@PathVariable Long id) {
  123. String result = "";
  124. JSONObject jsonSubject = new JSONObject();
  125. JSONObject jsonItem = new JSONObject();
  126. User user = userService.find(id);
  127. if (user != null) {
  128. try {
  129. userService.remove(user);
  130. result = MessageBundle.getMessageBundle("common.msg.remove.success");
  131. jsonItem.put("success", true);
  132. } catch (Throwable e) {
  133. result = MessageBundle.getMessageBundle("common.remove.msg.error");
  134. jsonItem.put("success", false);
  135. }
  136. }
  137. jsonItem.put("message", result);
  138. jsonSubject.accumulate("result", jsonItem);
  139. return jsonSubject.toString();
  140. }
  141. /**
  142. * Use public ModelAndView save(@ModelAttribute("user") User user, @RequestParam(defaultValue = "false") boolean changePassword)
  143. */
  144. @Override
  145. public ModelAndView save(User entity, BindingResult result, HttpServletRequest request) {
  146. return null;
  147. }
  148. @SecuredEnum({ UserPermission.USER_CREATE, UserPermission.USER_EDIT })
  149. @RequestMapping(value = "save", method = RequestMethod.POST)
  150. public ModelAndView save(@Valid @ModelAttribute("user") User entity, BindingResult result, HttpServletRequest request, @RequestParam(defaultValue = "false") boolean changePassword, @RequestParam(defaultValue = "") String passwordConfirmation) {
  151. ModelAndView mav = new ModelAndView();
  152. /*
  153. * Object validation
  154. */
  155. if (result.hasErrors() || entityHasErrors(entity, changePassword, passwordConfirmation)) {
  156. mav.setViewName(getRedirectionPath(request, Navigation.USER_NEW, Navigation.USER_EDIT));
  157. mav.addObject("user", entity);
  158. mav.addObject("groupList", userGroupService.list());
  159. mav.addObject("readOnly", false);
  160. mav.addObject("error", true);
  161. /*
  162. * especific validation to show or not the password field
  163. */
  164. String referer = request.getHeader("referer");
  165. if (referer != null && referer.contains(Navigation.USER_EDIT.getPath())) {
  166. mav.addObject("editing", true);
  167. }
  168. StringBuilder message = new StringBuilder();
  169. for (ObjectError error : result.getAllErrors()) {
  170. DefaultMessageSourceResolvable argument = (DefaultMessageSourceResolvable) error.getArguments()[0];
  171. message.append(MessageBundle.getMessageBundle(MessageBundle.getMessageBundle("common.field") + " " + "user." + argument.getDefaultMessage()) + ": " + error.getDefaultMessage() + "\n <br />");
  172. }
  173. message.append(additionalValidation(entity, changePassword, passwordConfirmation));
  174. mav.addObject("message", message.toString());
  175. return mav;
  176. }
  177. if (entity != null) {
  178. userService.save(entity, changePassword);
  179. mav = view(entity.getId(), request);
  180. mav.addObject("msg", true);
  181. mav.addObject("message", MessageBundle.getMessageBundle("common.msg.save.success"));
  182. }
  183. return mav;
  184. }
  185. @SecuredEnum(UserPermission.USER_LIST)
  186. @RequestMapping(value = "list", method = RequestMethod.GET)
  187. public ModelAndView list(HttpServletRequest request) {
  188. breadCrumbService.addNode(MessageBundle.getMessageBundle("breadcrumb.user.list"), 1, request);
  189. ModelAndView mav = new ModelAndView(Navigation.USER_LIST.getPath());
  190. List<User> userList = userService.list();
  191. mav.addObject("userList", userList);
  192. return mav;
  193. }
  194. @SecuredEnum(UserPermission.USER_LIST)
  195. @RequestMapping(value = "search", method = RequestMethod.POST)
  196. public ModelAndView search(@ModelAttribute("param") String param, HttpServletRequest request) {
  197. breadCrumbService.addNode(MessageBundle.getMessageBundle("breadcrumb.user.list"), 2, request);
  198. ModelAndView mav = new ModelAndView(Navigation.USER_LIST.getPath());
  199. SearchResult<User> result = userService.search(param);
  200. List<User> userList = result.getResults();
  201. mav.addObject("userList", userList);
  202. return mav;
  203. }
  204. @SecuredEnum(UserPermission.USER_LIST)
  205. @RequestMapping(value = "search-form", method = RequestMethod.GET)
  206. public ModelAndView searchForm(HttpServletRequest request) {
  207. breadCrumbService.addNode(MessageBundle.getMessageBundle("breadcrumb.user.search"), 1, request);
  208. ModelAndView mav = new ModelAndView(Navigation.USER_SEARCH.getPath());
  209. return mav;
  210. }
  211. @InitBinder
  212. protected void initBinder(WebDataBinder binder) {
  213. binder.registerCustomEditor(Set.class, "groups", new CustomCollectionEditor(Set.class) {
  214. @Override
  215. protected Object convertElement(Object element) {
  216. Long id = null;
  217. if(element instanceof String && !((String)element).equals("")){
  218. //From the JSP 'element' will be a String
  219. try{
  220. id = Long.parseLong((String) element);
  221. } catch (NumberFormatException e) {
  222. log.error("Element was " + ((String) element), e);
  223. }
  224. } else if(element instanceof Long) {
  225. //From the database 'element' will be a Long
  226. id = (Long) element;
  227. }
  228. return id != null ? userGroupService.find(id) : null;
  229. }
  230. });
  231. }
  232. private boolean entityHasErrors(User entity, boolean changePassword, String passwordConfirmation) {
  233. boolean hasErrors = false;
  234. if (entity != null) {
  235. if (validateEmail(entity)) {
  236. hasErrors = true;
  237. } else if(changePassword && !entity.getPassword().equals(passwordConfirmation)) {
  238. hasErrors = true;
  239. }
  240. }
  241. return hasErrors;
  242. }
  243. private boolean validateEmail(User entity){
  244. boolean hasError = false;
  245. User result = userService.findByLogin(entity.getEmail());
  246. if(result != null
  247. && !result.getId().equals(entity.getId())){
  248. hasError = true;
  249. }
  250. return hasError;
  251. }
  252. private String additionalValidation(User entity, boolean changePassword, String passwordConfirmation) {
  253. StringBuilder message = new StringBuilder();
  254. if (entity != null) {
  255. if (validateEmail(entity)) {
  256. message.append(MessageBundle.getMessageBundle("user.email") + ": " + MessageBundle.getMessageBundle("user.email.duplicate") + "\n <br />");
  257. }
  258. if(changePassword && !entity.getPassword().equals(passwordConfirmation)) {
  259. message.append(MessageBundle.getMessageBundle("user.password.confirmation") + ": " + MessageBundle.getMessageBundle("user.password.confirmatin.failure") + "\n <br />");
  260. }
  261. }
  262. return message.toString();
  263. }
  264. }