/**
   * Persist a FormTempate.
   *
   * @param formTemplate - FormTemplate.
   * @param result - used for errorhandling.
   * @param status - used for session state handling.
   * @param model - ModelMap
   * @return navigate to Templatelist or back to TemplateEdit.
   */
  @Transactional
  @RequestMapping(method = RequestMethod.POST)
  public String addTemplate(
      @Valid @ModelAttribute("formTemplate") FormTemplate formTemplate,
      BindingResult result,
      SessionStatus status,
      ModelMap model) {
    if (result.hasErrors()) {
      return "TemplateEdit";
    }

    CustomCategory customCategory = formTemplate.getCustomCategory();
    if (customCategory != null) {
      for (Iterator<CustomSubCategory> it = customCategory.getCustomSubCategories().iterator();
          it.hasNext(); ) {
        CustomSubCategory subCategory = it.next();
        if (StringUtils.isBlank(subCategory.getName())) {
          it.remove();
        }
      }
    }

    formTemplate.setLastChanged(new Date());
    if (formTemplate.getId() == null) {
      formTemplateRepository.persist(formTemplate);
    } else {
      formTemplateRepository.merge(formTemplate);
    }

    status.setComplete();

    return "redirect:TemplateList";
  }