@RequestMapping(value = "/edit", method = RequestMethod.GET)
  public String prepareEdit(
      @RequestParam(value = "key", required = false) Integer key, Model model) {
    if (key == null) {
      ProductForm productForm = new ProductForm();
      model.addAttribute("productForm", productForm);
    } else {
      Product product = this.productDAO.findById(key);
      ProductForm productForm = new ProductForm(product);
      model.addAttribute("productForm", productForm);
    }

    // TODO Move this code in ControllerHelper
    //  store all units for combo
    List<Unit> units = unitDAO.findAll();
    Map<Integer, String> allUnits = new LinkedHashMap<Integer, String>();
    for (Unit unit : units) {
      allUnits.put(unit.getId(), unit.getName());
    }
    model.addAttribute("allUnits", allUnits);

    List<ProductCategory> categories = this.categoryDAO.findAll();
    Map<Integer, String> categoryForms = new LinkedHashMap<Integer, String>();
    for (ProductCategory category : categories) {
      categoryForms.put(category.getId(), category.getName());
    }
    model.addAttribute("allCategories", categoryForms);

    return "products/edit";
  }
  @RequestMapping(value = "/edit", method = RequestMethod.POST)
  public String processUpdate(
      @Validated ProductForm formProduct, BindingResult result, Model model) {
    if (result.hasErrors()) {
      return "products/edit";
    }

    Product product = (Product) formProduct.getProduct();
    if (product.getId() != null) {
      // product update
      product = productDAO.findById(formProduct.getId());

      product.setName(formProduct.getName());
      product.setShared(formProduct.getShared());
      product.setAmount(formProduct.getAmount());
      product.setMaxPoints(formProduct.getMaxPoints());
      product.setPoints(formProduct.getPoints());
      product.setDescription(formProduct.getDescription());
    }

    //  Unit returned by formProduct contains only the ID in the name property of Unit instance.
    Unit unit = unitDAO.findById(formProduct.getUnitId());
    product.setUnit(unit);

    //  Category returned by formProduct contains only the ID in the name property of Category
    // instance.
    ProductCategory category = this.categoryDAO.findById(formProduct.getCategoryId());
    product.setCategory(category);

    this.productDAO.update(product);
    return "redirect:/products/list";
  }