package net.stsmedia.financemanager.web.mvc; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import net.stsmedia.financemanager.domain.Cash; import net.stsmedia.financemanager.domain.Loan; import net.stsmedia.financemanager.domain.ManagedFund; import net.stsmedia.financemanager.domain.Person; import net.stsmedia.financemanager.domain.Product; import net.stsmedia.financemanager.service.PersonService; import net.stsmedia.financemanager.service.ProductService; import net.stsmedia.financemanager.web.editors.PersonEditor; import net.stsmedia.financemanager.web.editors.ProductEditor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Controller; import org.springframework.ui.ModelMap; import org.springframework.util.Assert; 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.RequestMethod; import org.springframework.web.context.request.WebRequest; /** * This is a Controller for the {@link Product} domain object. It demonstrates * the use of the new Spring 3.0 REST support. * * @author Stefan Schmidt * @since 0.2 * */ @Controller @RequestMapping("/product/**") public class ProductController { @Autowired private ProductService productService; @Autowired private PersonService personService; private Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); @RequestMapping(value = "/product", method = RequestMethod.GET) public String list(ModelMap modelMap) { modelMap.addAttribute("products", productService.findAll()); return "product/list"; } @RequestMapping(value = "/product/{id}", method = RequestMethod.GET) public String show(@PathVariable("id") Long id, ModelMap modelMap) { Assert.notNull(id, "Identifier must be provided."); modelMap.addAttribute("product", productService.find(id)); return "product/show"; } @RequestMapping(value = "/product/{id}", method = RequestMethod.DELETE) public String delete(@PathVariable("id") Long id, ModelMap modelMap) { Assert.notNull(id, "Identifier must be provided."); try { productService.remove(productService.find(id)); } catch (DataIntegrityViolationException e) { modelMap.addAttribute("integrityViolation", "Could not delete " + "this person as it is connected to an account. Please delete " + "the relevant account(s) first."); } return "redirect:/product"; } @RequestMapping(value = "/product/form/{type}", method = RequestMethod.GET) public String form(@PathVariable("type") String type, ModelMap modelMap) { if ("cash".equals(type)) { modelMap.addAttribute("cash", new Cash()); } else if ("managedFund".equals(type)) { modelMap.addAttribute("managedFund", new ManagedFund()); } else if ("loan".equals(type)) { modelMap.addAttribute("loan", new Loan()); modelMap.addAttribute("lenders", personService.findAll()); } return "product/create"; } @RequestMapping(value = "/product/cash", method = RequestMethod.POST) public String createCash(@ModelAttribute("cash") Cash product, BindingResult result) { Assert.notNull(product, "Product must be provided."); for (ConstraintViolation<Cash> constraint : validator.validate(product)) { result.rejectValue(constraint.getPropertyPath().toString(), "", constraint.getMessage()); } if (result.hasErrors()) return "product/create"; productService.persist(product); return "redirect:/product/" + product.getId(); } @RequestMapping(value = "/product/managedFund", method = RequestMethod.POST) public String createManagedFund(@ModelAttribute("managedFund") ManagedFund product, BindingResult result) { Assert.notNull(product, "Product must be provided."); for (ConstraintViolation<ManagedFund> constraint : validator.validate(product)) { result.rejectValue(constraint.getPropertyPath().toString(), "", constraint.getMessage()); } if (result.hasErrors()) return "product/create"; productService.persist(product); return "redirect:/product/" + product.getId(); } @RequestMapping(value = "/product/loan", method = RequestMethod.POST) public String createLoan(@ModelAttribute("loan") Loan product, BindingResult result) { Assert.notNull(product, "Product must be provided."); for (ConstraintViolation<Loan> constraint : validator.validate(product)) { result.rejectValue(constraint.getPropertyPath().toString(), "", constraint.getMessage()); System.err.println("\n\n " + constraint.getMessage() + "\n\n"); } if (result.hasErrors()) return "product/create"; productService.persist(product); return "redirect:/product/" + product.getId(); } @RequestMapping(value = "/product/{id}/form", method = RequestMethod.GET) public String updateForm(@PathVariable("id") Long id, ModelMap modelMap) { Assert.notNull(id, "Identifier must be provided."); modelMap.addAttribute("product", productService.find(id)); return "product/update"; } @RequestMapping(value = "/product/Cash", method = RequestMethod.PUT) public String updateCash(@ModelAttribute("cash") Cash product, BindingResult result) { Assert.notNull(product, "product must be provided."); for (ConstraintViolation<Cash> constraint : validator.validate(product)) { result.rejectValue(constraint.getPropertyPath().toString(), "", constraint.getMessage()); } if (result.hasErrors()) return "product/update"; productService.merge(product); return "redirect:/product/" + product.getId(); } @RequestMapping(value = "/product/ManagedFund", method = RequestMethod.PUT) public String updateManagedFund(@ModelAttribute("ManagedFund") ManagedFund product, BindingResult result) { Assert.notNull(product, "product must be provided."); for (ConstraintViolation<ManagedFund> constraint : validator.validate(product)) { result.rejectValue(constraint.getPropertyPath().toString(), "", constraint.getMessage()); } if (result.hasErrors()) return "product/update"; productService.merge(product); return "redirect:/product/" + product.getId(); } @RequestMapping(value = "/product/Loan", method = RequestMethod.PUT) public String updateLoan(@ModelAttribute("loan") Loan product, BindingResult result) { Assert.notNull(product, "product must be provided."); for (ConstraintViolation<Loan> constraint : validator.validate(product)) { result.rejectValue(constraint.getPropertyPath().toString(), "", constraint.getMessage()); } if (result.hasErrors()) return "product/update"; productService.merge(product); return "redirect:/product/" + product.getId(); } @InitBinder public void initBinder(WebDataBinder binder, WebRequest request) { binder.registerCustomEditor(Product.class, new ProductEditor(productService)); binder.registerCustomEditor(Person.class, new PersonEditor(personService)); } }