/**
   * Processes the submit of update contact form.
   *
   * @param dto The form object.
   * @param result The binding result describing whether there is validation errors.
   * @param attributes The redirect attributes used when request is redirected forward.
   * @return A redirect view name to the view contract page.
   * @throws NotFoundException
   */
  @RequestMapping(value = "/contact/update", method = RequestMethod.POST)
  public String updateContact(
      @Valid @ModelAttribute(MODEL_ATTRIBUTE_CONTACT) ContactDTO dto,
      BindingResult result,
      RedirectAttributes attributes)
      throws NotFoundException {
    LOGGER.debug("Updating contact with information: {}", dto);

    if (result.hasErrors()) {
      LOGGER.debug("Form was submitted with validation errors. Rendering form view.");
      return UPDATE_CONTACT_VIEW;
    }

    Contact updated = service.update(dto);
    LOGGER.debug("Updated contact with information: {}", updated);

    attributes.addAttribute(PARAMETER_CONTACT_ID, updated.getId());
    addFeedbackMessage(
        attributes,
        FEEDBACK_MESSAGE_KEY_CONTACT_UPDATED,
        updated.getFirstName(),
        updated.getLastName());

    return createRedirectViewPath(REQUEST_MAPPING_VIEW_CONTACT);
  }
  /**
   * Shows the home page.
   *
   * @param model The model.
   * @return The name of the home page view.
   */
  @RequestMapping(value = "/", method = RequestMethod.GET)
  public String showHomePage(Model model) {
    LOGGER.debug("Rendering home page");

    List<Contact> contacts = service.findAll();
    model.addAttribute(MODEL_ATTRIBUTE_CONTACTS, contacts);

    return HOME_VIEW;
  }
  /**
   * Shows the view contact page
   *
   * @param id The id of the viewed contact.
   * @param model The model.
   * @return The name of the view contact view.
   * @throws NotFoundException if not contact is found iwth the given id.
   */
  @RequestMapping(value = "/contact/{id}", method = RequestMethod.GET)
  public String showContactPage(@PathVariable("id") Long id, Model model) throws NotFoundException {
    LOGGER.debug("Showing contact page for contact with id: {}", id);

    Contact found = service.findById(id);
    LOGGER.debug("Found contact: {}", found);

    model.addAttribute(MODEL_ATTRIBUTE_CONTACT, found);
    return CONTACT_VIEW;
  }
  /**
   * Processes delete contact ajax request.
   *
   * @param id The id of the deleted contact.
   * @return The feedback message.
   * @throws NotFoundException if no contact is found with the given id.
   */
  @RequestMapping(value = "/contact/{id}", method = RequestMethod.DELETE)
  @ResponseBody
  public String deleteContact(@PathVariable("id") Long id) throws NotFoundException {
    LOGGER.debug("Deleting contact with id: {}", id);

    Contact deleted = service.deleteById(id);
    LOGGER.debug("Deleted contact: {}", deleted);

    return getMessage(
        FEEDBACK_MESSAGE_KEY_CONTACT_DELETED, deleted.getFirstName(), deleted.getLastName());
  }
  /**
   * Shows update contact page.
   *
   * @param id The id of the updated contact.
   * @param model The model.
   * @return The name of the update contact view.
   * @throws NotFoundException if no contact is found with the given id.
   */
  @RequestMapping(value = "/contact/update/{id}", method = RequestMethod.GET)
  public String showUpdateContactPage(@PathVariable("id") Long id, Model model)
      throws NotFoundException {
    LOGGER.debug("Showing edit contact for a contact with id: {}", id);

    Contact updated = service.findById(id);
    LOGGER.debug("Found contact: {}", updated);

    ContactDTO formObject = createFormObject(updated);
    model.addAttribute(MODEL_ATTRIBUTE_CONTACT, formObject);

    return UPDATE_CONTACT_VIEW;
  }