@RequestMapping(
      value = {"/save"},
      method = RequestMethod.POST)
  public ModelAndView save(
      @ModelAttribute("backup") @Valid Backup backup,
      BindingResult result,
      RedirectAttributes redirectAttributes) {

    if (result.hasErrors()) return editView(backup);

    if (!canWrite(backup.getOutputFolder())) {
      ObjectError error =
          new ObjectError("backup", "The provided output folder needs write permission");
      result.addError(error);
      return editView(backup);
    }

    if (backup.getDatabases() == null || backup.getDatabases().size() == 0) {
      ObjectError error =
          new ObjectError("databases", "At least one database needs to be selected");
      result.addError(error);
      return editView(backup);
    }

    if (backup.getId() == null) backupService.save(backup);
    else backupService.update(backup);

    redirectAttributes.addFlashAttribute("backup", backup);
    return new ModelAndView("redirect:/backups/list");
  }
 @RequestMapping(
     value = {"/remove/{id}"},
     method = RequestMethod.GET)
 public ModelAndView remove(@PathVariable(value = "id") Integer backupId) {
   backupService.removeById(backupId);
   return new ModelAndView("redirect:/backups/list");
 }
  @RequestMapping(
      value = {"/edit/{id}"},
      method = RequestMethod.GET)
  public ModelAndView edit(@PathVariable(value = "id") Integer backupId) {

    Backup alert = backupService.getById(backupId);
    if (alert == null) return getModelView("forward:/404");

    return editView(alert);
  }
  @RequestMapping(
      value = {"/list"},
      method = RequestMethod.GET)
  public ModelAndView list() {

    ModelAndView mview =
        getModelView("list_backups", "MongoDB Backups", "List of Application Alerts");

    List<Breadcrumb> bds = new ArrayList<Breadcrumb>();
    bds.add(new Breadcrumb("Hosts"));
    bds.add(new Breadcrumb("Backups", "backups/list"));
    mview.addObject("breadcrumbs", bds);

    List<Backup> backups = backupService.list();
    mview.addObject("backups", backups);

    setupView(mview);
    return mview;
  }