@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 = "/list", method = RequestMethod.GET)
  public String prepareList(
      @RequestParam(value = "queryName", required = false) String queryName,
      @RequestParam(value = "category", required = false) Integer categoryId,
      @RequestParam(value = "page", required = false) Integer pageIndex,
      Model model) {

    ProductCategory category = null;

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

    if (!StringUtils.isEmpty(queryName) && queryName.endsWith(",")) {
      //  browser returns the param followed by a comma ??
      queryName = queryName.substring(0, queryName.indexOf(','));

      if (queryName.startsWith("%")) {
        model.addAttribute("queryName", queryName);
      }
    }
    model.addAttribute("category", categoryId);

    Page<Product> products = this.productDAO.findByNameAndCategory(queryName, category, pageIndex);
    List<ProductForm> forms = new ArrayList<ProductForm>(products.size());
    for (Product product : products) {
      forms.add(new ProductForm(product));
    }
    model.addAttribute("products", forms);

    model.addAttribute("currentPage", products.getCurrentPage());
    model.addAttribute("pageCount", products.getPageCount());

    if (!model.containsAttribute("finderMode")) {
      model.addAttribute("finderMode", false);
    }

    return "products/list";
  }
  @Override
  @Transactional
  public void update(ProductCategory category) {
    if (category.getId() == null) {
      insert(category);
    }
    ;

    Session session = sessionFactory.getCurrentSession();
    session.update(category);
  }