/** * Copyright 2012-2013 Maciej Jaworski, Mariusz Kapcia, Paweł Kędzia, Mateusz Kubuszok * * <p>Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at</p> * * <p>http://www.apache.org/licenses/LICENSE-2.0</p> * * <p>Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License.</p> */ package com.autoupdater.server.controllers; import static org.apache.log4j.Logger.getLogger; import static org.springframework.web.bind.annotation.RequestMethod.*; import javax.validation.Valid; import org.apache.log4j.Logger; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.SessionAttributes; import com.autoupdater.server.models.EUserType; import com.autoupdater.server.models.User; /** * Responsible for rendering user panel. */ @Controller @SessionAttributes({ "newUser", "user" }) @RequestMapping(value = "/users") public final class UsersController extends AppController { /** * Controller's logger. */ private static final Logger logger = getLogger(UsersController.class); /** * Renders list of users. * * Let JSF run /views/users/index.jsp on GET /server/users request. * * @param model * passed model * @return facelet name */ @RequestMapping(method = GET) public String index(Model model) { logger.debug("Received request: GET /users"); model.addAttribute("users", userService.findAll()); logger.debug("Renders requiest: /users"); return "users/index"; } /** * Renders new users form. * * Let JSF run /views/users/new.jsp on GET /server/users/add request. * * @param model * passed model * @return facelet name */ @RequestMapping(value = "/add", method = GET) public String createForm(Model model) { logger.debug("Received request: GET /users/add"); model.addAttribute("newUser", new User()); model.addAttribute("types", EUserType.values()); logger.debug("Renders request: GET /users/add"); return "users/new"; } /** * Saves new user. * * Creates user and redirects to /users on POST /server/users/add request. * * On errors let JSF run /views/users/new.jsp. * * @param user * user * @param result * validation result * @param model * passed model * @return facelet name or redirect */ @RequestMapping(value = "/add", method = POST) public String create(@Valid @ModelAttribute("newUser") User user, BindingResult result, Model model) { logger.debug("Received request: POST /users/add"); if (result.hasErrors()) { model.addAttribute("newUser", user); model.addAttribute("types", EUserType.values()); logger.debug("Renders request: POST /users/add (validation failed)"); return "users/new"; } userService.persist(user); logger.debug("Redirect to /users (User created)"); return "redirect:"; } /** * Renders form to edit existing user. * * Let JSF run /views/users/edit.jsp on GET /server/updates/edit/{id} * request. * * @param id * user's ID * @param model * passed model * @return facelet name */ @RequestMapping(value = "/edit/{id}", method = GET) public String editForm(@PathVariable("id") Integer id, Model model) { logger.debug("Received request: GET /users/edit/" + id); model.addAttribute("user", userService.findById(id)); model.addAttribute("types", EUserType.values()); logger.debug("Renders request: GET /users/edit/" + id); return "users/edit"; } /** * Saves changes. * * Updates user and redirects to /users on POST /server/users/edit request. * * On errors let JSF run /views/users/edit.jsp. * * @param user * user to be changed * @param result * validation result * @param model * passed model * @return facelet name or redirect */ @RequestMapping(value = "/edit", method = POST) public String edit(@Valid @ModelAttribute("user") User user, BindingResult result, Model model) { logger.debug("Received request: POST /users/edit"); if (result.hasErrors()) { model.addAttribute("user", user); model.addAttribute("types", EUserType.values()); logger.debug("Renders request: POST /users/edit (validation failed)"); return "users/edit"; } userService.merge(user); logger.debug("Redirect to /users (User updated)"); return "redirect:"; } /** * Deletes user from list. * * Deletes user and redirects to /users on GET /server/users/delete/{id} * request. * * @param id * user's ID * @param model * passed model * @return facelet name */ @RequestMapping(value = "/delete/{id}", method = GET) public String delete(@PathVariable("id") Integer id, Model model) { logger.debug("Received request: GET /users/delete/" + id); userService.remove(userService.findById(id)); logger.debug("Redirect to /users (User deleted)"); return "redirect:"; } /** * Filters values passed to command object "newUser". * * @param binder * binder that will bind sent information to command object */ @InitBinder("newUser") public void configureBindingOfNewUser(WebDataBinder binder) { logger.debug("Securing \"newUser\" modelAttribute"); binder.setAllowedFields("username", "name", "password", "confirmPassword", "userType"); } /** * Filters values passed to command object "user". * * @param binder * binder that will bind sent information to command object */ @InitBinder("user") public void configureBindingOfUser(WebDataBinder binder) { logger.debug("Securing \"user\" modelAttribute"); binder.setAllowedFields("username", "name", "userType"); } }