package net.stsmedia.financemanager.web.mvc; import java.text.SimpleDateFormat; import java.util.Date; import javax.validation.ConstraintViolation; import javax.validation.Validation; import javax.validation.Validator; import net.stsmedia.financemanager.domain.Account; import net.stsmedia.financemanager.domain.Investment; import net.stsmedia.financemanager.domain.Person; import net.stsmedia.financemanager.domain.Product; import net.stsmedia.financemanager.service.AccountService; import net.stsmedia.financemanager.service.InvestmentService; 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.beans.propertyeditors.CustomDateEditor; 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; /** * This is a Controller for the {@link Account} domain object. It demonstrates * the use of the new Spring 3.0 REST support. * * @author Stefan Schmidt * @since 0.2 * */ @Controller @RequestMapping("/account/**") public class AccountController { @Autowired private AccountService accountService; @Autowired private PersonService personService; @Autowired private InvestmentService investmentService; @Autowired private ProductService productService; private Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); @RequestMapping(value = "/account", method = RequestMethod.GET) public String list(ModelMap modelMap) { modelMap.addAttribute("accounts", accountService.findAll()); return "account/list"; } @RequestMapping(value = "/account/{id}", method = RequestMethod.GET) public String show(@PathVariable("id") Long id, ModelMap modelMap) { Assert.notNull(id, "Identifier must be provided."); modelMap.addAttribute("account", accountService.find(id)); modelMap.addAttribute("investment", new Investment()); modelMap.addAttribute("products", productService.findAll()); return "account/show"; } @RequestMapping(value = "/account/{id}", method = RequestMethod.DELETE) public String delete(@PathVariable("id") Long id) { Assert.notNull(id, "Identifier must be provided."); accountService.remove(accountService.find(id)); return "redirect:/account"; } @RequestMapping(value = "/account/form", method = RequestMethod.GET) public String form(ModelMap modelMap) { modelMap.addAttribute("people", personService.findAll()); modelMap.addAttribute("account", new Account()); return "account/create"; } @RequestMapping(value = "/account", method = RequestMethod.POST) public String create(@ModelAttribute("account") Account account, BindingResult result) { Assert.notNull(account, "Account must be provided."); for (ConstraintViolation<Account> constraint : validator.validate(account)) { result.rejectValue(constraint.getPropertyPath().toString(), "", constraint.getMessage()); } if (result.hasErrors()) return "account/create"; accountService.persist(account); return "redirect:/account/" + account.getId(); } @RequestMapping(value = "/account/{id}/form", method = RequestMethod.GET) public String updateForm(@PathVariable("id") Long id, ModelMap modelMap) { Assert.notNull(id, "Identifier must be provided."); modelMap.addAttribute("people", personService.findAll()); modelMap.addAttribute("investments", investmentService.findAll()); modelMap.addAttribute("account", accountService.find(id)); return "account/update"; } @RequestMapping(method = RequestMethod.PUT) public String update(@ModelAttribute("account") Account account, BindingResult result) { Assert.notNull(account, "Account must be provided."); for (ConstraintViolation<Account> constraint : validator.validate(account)) { result.rejectValue(constraint.getPropertyPath().toString(), "", constraint.getMessage()); } if (result.hasErrors()) return "account/update"; accountService.merge(account); return "redirect:/account/" + account.getId(); } @RequestMapping(value = "/{accountId}/investment", method = RequestMethod.POST) public String create(@PathVariable("accountId") Long accountId, @ModelAttribute("investment") Investment investment) { Assert.notNull(investment, "Investment must be provided."); Assert.notNull(accountId, "Account ID be provided."); investmentService.persist(investment); Account account = accountService.find(accountId); account.addInvestment(investment); accountService.merge(account); return "redirect:/account/" + accountId; } @InitBinder void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("MM/dd/yyyy"), false)); binder.registerCustomEditor(Product.class, new ProductEditor(productService)); binder.registerCustomEditor(Person.class, new PersonEditor(personService)); } }