package nl.ipo.cds.admin.ba.controller.gebruikersbeheer; import java.util.List; import javax.inject.Inject; import javax.validation.Valid; import nl.ipo.cds.admin.ba.controller.gebruikersbeheer.beans.BronhouderForm; import nl.ipo.cds.dao.ManagerDao; import nl.ipo.cds.domain.Bronhouder; import nl.ipo.cds.domain.Dataset; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; /** * Controller to support CRUD operations on "Bronhouders" in the admin. */ @Controller @RequestMapping ("/ba/gebruikersbeheer/bronhouders") public final class BronhouderController { @Inject private ManagerDao managerDao; /** * Index page: lists bronhouders. */ @RequestMapping (method = RequestMethod.GET) public String listBronhouders (final Model model) { final List<Bronhouder> bronhouders = managerDao.getAllBronhouders (); model.addAttribute ("bronhouders", bronhouders); return "/ba/gebruikersbeheer/bronhouders"; } /** * Displays the form for creating a new bronhouder. */ @RequestMapping (value = "/-/create", method = RequestMethod.GET) public String createBronhouderForm (final Model model) { model.addAttribute ("bronhouderForm", new BronhouderForm ()); return "/ba/gebruikersbeheer/edit-bronhouder"; } /** * Processes a POST of the create bronhouder form. */ @RequestMapping (value = "/-/create", method = RequestMethod.POST) @Transactional public String processCreateBronhouderForm ( final @Valid BronhouderForm bronhouderForm, final BindingResult bindingResult, final Model model) { // Run additional validations: validateBronhouderForm (bindingResult, null); // Show the form again if it has errors: if (bindingResult.hasErrors ()) { return "/ba/gebruikersbeheer/edit-bronhouder"; } // Save the bronhouder: managerDao.create (copyBronhouderForm (bronhouderForm, new Bronhouder ())); return "redirect:/ba/gebruikersbeheer/bronhouders"; } /** * Displays the form for editing bronhouders. * * @param bronhouderId The ID of the bronhouder to edit. */ @RequestMapping (value = "/{bronhouderId}/edit", method = RequestMethod.GET) public String editBronhouderForm (final @PathVariable("bronhouderId") long bronhouderId, final Model model) { final Bronhouder bronhouder = managerDao.getBronhouder (bronhouderId); if (bronhouder == null) { return "redirect:/ba/gebruikersbeheer/bronhouders"; } model.addAttribute ("bronhouderForm", new BronhouderForm (bronhouder)); return "/ba/gebruikersbeheer/edit-bronhouder"; } /** * Processes a POST of the bronhouder edit form. * * @param bronhouderId The ID of the bronhouder to save. */ @RequestMapping (value = "/{bronhouderId}/edit", method = RequestMethod.POST) @Transactional public String processEditBronhouderForm ( final @PathVariable ("bronhouderId") long bronhouderId, final @Valid BronhouderForm bronhouderForm, final BindingResult bindingResult) { final Bronhouder bronhouder = managerDao.getBronhouder (bronhouderId); if (bronhouder == null) { return "redirect:/ba/gebruikersbeheer/bronhouders"; } // Run additional validations on the bronhouder form: validateBronhouderForm (bindingResult, bronhouder); // Display the form again in case of errors: if (bindingResult.hasErrors ()) { return "/ba/gebruikersbeheer/edit-bronhouder"; } // Save the bronhouder: managerDao.update (copyBronhouderForm (bronhouderForm, bronhouder)); return "redirect:/ba/gebruikersbeheer/bronhouders"; } /** * Displays the form for deleting a bronhouder. * * @param bronhouderId The ID of the bronhouder to delete. */ @RequestMapping (value = "/{bronhouderId}/delete", method = RequestMethod.GET) public String deleteBronhouderForm (final @PathVariable("bronhouderId") long bronhouderId, final Model model) { final Bronhouder bronhouder = managerDao.getBronhouder (bronhouderId); if (bronhouder == null) { return "redirect:/ba/gebruikersbeheer/bronhouders"; } // Test whether the bronhouder can be deleted: model.addAttribute ("bronhouderDatasets", managerDao.getDatasetsByBronhouder (bronhouder)); model.addAttribute ("bronhouder", bronhouder); return "/ba/gebruikersbeheer/delete-bronhouder"; } /** * Processes a POST of the bronhouder delete form. * * @param bronhouderId */ @RequestMapping (value = "/{bronhouderId}/delete", method = RequestMethod.POST) @Transactional public String processDeleteBronhouderForm (final @PathVariable("bronhouderId") long bronhouderId, final Model model) { final Bronhouder bronhouder = managerDao.getBronhouder (bronhouderId); if (bronhouder == null) { return "redirect:/ba/gebruikersbeheer/bronhouders"; } final List<Dataset> bronhouderDatasets = managerDao.getDatasetsByBronhouder (bronhouder); if (!bronhouderDatasets.isEmpty ()) { model.addAttribute ("bronhouderDatasets", bronhouderDatasets); model.addAttribute ("bronhouder", bronhouder); return "/ba/gebruikersbeheer/delete-bronhouder"; } // Delete the bronhouder and related jobs: managerDao.delete (bronhouder); return "redirect:/ba/gebruikersbeheer/bronhouders"; } /** * Peforms additional validations on the given form that are not easily tested using validation * annotations. Checks for uniqueness of the code, name and common name properties. * * Properties that have errors are rejected on the binding result. * * @param bindingResult The binding result that contains the current (unvalidated) values of the form. * @param bronhouder The original bronhouder, or null if there is no original (in case of a create action). */ private void validateBronhouderForm (final BindingResult bindingResult, final Bronhouder bronhouder) { final String code = (String) bindingResult.getFieldValue ("code"); final String naam = (String) bindingResult.getFieldValue ("naam"); final String commonName = (String) bindingResult.getFieldValue ("commonName"); // Check the code for uniqueness: if (code != null && !code.isEmpty ()) { final Bronhouder duplicateCode = managerDao.getBronhouderByCode (code); if (duplicateCode != null && !(bronhouder != null && bronhouder.getId ().equals (duplicateCode.getId ()))) { bindingResult.rejectValue ("code", "CODE_DUPLICATE", String.format ("De code %s is al in gebruik bij een andere bronhouder", code)); } } // Check the name for uniqueness: if (naam != null && !naam.isEmpty ()) { final Bronhouder duplicateNaam = managerDao.getBronhouderByNaam (naam); if (duplicateNaam != null && !(bronhouder != null && bronhouder.getId ().equals (duplicateNaam.getId ()))) { bindingResult.rejectValue ("naam", "NAAM_DUPLICATE", String.format ("De naam %s is al in gebruik bij een andere bronhouder", naam)); } } // Check the common name for uniqueness: if (commonName != null && !commonName.isEmpty ()) { final Bronhouder duplicateCommonName = managerDao.getBronhouderByCommonName (commonName); if (duplicateCommonName != null && !(bronhouder != null && bronhouder.getId ().equals (duplicateCommonName.getId ()))) { bindingResult.rejectValue ("commonName", "COMMON_NAME_DUPLICATE", String.format ("De identificatie %s is al in gebruik bij een andere bronhouder", commonName)); } } } /** * Copies the properties of the given form to the given bronhouder instance. * * @param form The source form. * @param bronhouder The destination bronhouder. * @return The destination bronhouder. */ private Bronhouder copyBronhouderForm (final BronhouderForm form, final Bronhouder bronhouder) { bronhouder.setCode (form.getCode ()); bronhouder.setCommonName (form.getCommonName ()); bronhouder.setContactAdres (form.getContactAdres ()); bronhouder.setContactEmailadres (form.getContactEmailadres ()); bronhouder.setContactNaam (form.getContactNaam ()); bronhouder.setContactPlaats (form.getContactPlaats ()); bronhouder.setContactPostcode (form.getContactPostcode ()); bronhouder.setContactTelefoonnummer (form.getContactTelefoonnummer ()); bronhouder.setNaam (form.getNaam ()); return bronhouder; } }