package net.stsmedia.financemanager.web.mvc;
import javax.validation.ConstraintViolation;
import javax.validation.Validation;
import javax.validation.Validator;
import net.stsmedia.financemanager.domain.Person;
import net.stsmedia.financemanager.security.Authorities;
import net.stsmedia.financemanager.service.AuthorityService;
import net.stsmedia.financemanager.service.PersonService;
import net.stsmedia.financemanager.web.editors.PersonEditor;
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 Person} domain object. It demonstrates
* the use of the new Spring 3.0 REST support.
*
* @author Stefan Schmidt
* @since 0.1
*
*/
@Controller
@RequestMapping("/person/**")
public class PersonController {
@Autowired
private PersonService personService;
@Autowired
private AuthorityService authorityService;
private Validator validator = Validation.buildDefaultValidatorFactory().getValidator();
@RequestMapping(value = "/person/{id}", method = RequestMethod.GET)
public String show(@PathVariable("id") Long id, ModelMap modelMap) {
Assert.notNull(id, "Identifier must be provided.");
modelMap.addAttribute("person", personService.find(id));
return "person/show";
}
@RequestMapping(value = "/person", method = RequestMethod.GET)
public String list(ModelMap modelMap) {
modelMap.addAttribute("people", personService.findAll());
return "person/list";
}
@RequestMapping(value = "/person/{id}", method = RequestMethod.DELETE)
public String delete(@PathVariable("id") Long id, ModelMap modelMap) {
Assert.notNull(id, "Identifier must be provided.");
try {
personService.remove(personService.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:/person";
}
@RequestMapping(value = "/person/form", method = RequestMethod.GET)
public String form(ModelMap modelMap) {
modelMap.addAttribute("person", new Person());
return "person/create";
}
@RequestMapping(value = "/person", method = RequestMethod.POST)
public String create(@ModelAttribute("person") Person person, BindingResult result) {
Assert.notNull(person, "Person must be provided.");
//create 'user' role authority for this user
Authorities authorities = new Authorities();
authorities.setUsername(person.getEmail());
authorities.setAuthority("ROLE_USER");
authorityService.persist(authorities);
for (ConstraintViolation<Person> constraint : validator.validate(person)) {
result.rejectValue(constraint.getPropertyPath().toString(), "", constraint.getMessage());
}
if (result.hasErrors())
return "/person/create";
personService.persist(person);
return "redirect:/person/" + person.getId();
}
@RequestMapping(value = "/person/{id}/form", method = RequestMethod.GET)
public String updateForm(@PathVariable("id") Long id, ModelMap modelMap) {
Assert.notNull(id, "Identifier must be provided.");
modelMap.addAttribute("person", personService.find(id));
return "person/update";
}
@RequestMapping(method = RequestMethod.PUT)
public String update(@ModelAttribute("person") Person person, BindingResult result) {
Assert.notNull(person, "Person must be provided.");
for (ConstraintViolation<Person> constraint : validator.validate(person)) {
result.rejectValue(constraint.getPropertyPath().toString(), "", constraint.getMessage());
}
if (result.hasErrors())
return "person/update";
personService.merge(person);
return "redirect:/person/" + person.getId();
}
@InitBinder
public void initBinder(WebDataBinder binder, WebRequest request) {
binder.registerCustomEditor(Person.class, new PersonEditor(personService));
}
}