@PreAuthorize("hasRole('ROLE_DOWNLOAD')")
 @Transactional(readOnly = true, propagation = Propagation.REQUIRED)
 @Cacheable(value = "product", key = "#id")
 public Product getProductToDownload(Long id) {
   // TODO remove method cause duplicated and not used
   return productDao.read(id);
 }
  public void addProduct(
      URL path,
      User owner,
      final List<Collection> collections,
      String origin,
      Scanner scanner,
      FileScannerWrapper wrapper)
      throws DataStoreAlreadyExistException {
    if (productDao.exists(path)) {
      throw new DataStoreAlreadyExistException(
          "Product \"" + path.toExternalForm() + "\" already present in the system.");
    }

    /* **** CRITICAL SECTION *** */
    /** THIS SECTION SHALL NEVER BE STOPPED BY CNTRL-C OR OTHER SIGNALS */
    /* TODO: check if shutdownHook can protect this section */
    Product product = new Product();
    product.setPath(path);
    product.setOrigin(origin);
    List<User> users = new ArrayList<User>();

    if (owner != null) {
      product.setOwner(owner);
      users.add(userDao.read(owner.getId()));
      product.setAuthorizedUsers(new HashSet<User>(users));
    }

    product = productDao.create(product);

    // FIX
    product = productDao.read(product.getId());
    /* **** CRITICAL SECTION *** */
    processProduct(product, owner, collections, scanner, wrapper);
  }
 @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
 @CacheEvict(
     value = {"indexes"},
     key = "#product_id")
 public void setIndexes(Long product_id, List<MetadataIndex> indexes) {
   Product product = productDao.read(product_id);
   product.setIndexes(indexes);
   productDao.update(product);
 }
 @Transactional(readOnly = true, propagation = Propagation.REQUIRED)
 @Cacheable(
     value = {"indexes"},
     key = "#product_id")
 public List<MetadataIndex> getIndexes(Long product_id) {
   Product product = productDao.read(product_id);
   Hibernate.initialize(product.getIndexes());
   return product.getIndexes();
 }
  @Transactional(readOnly = false, propagation = Propagation.REQUIRED)
  @Caching(
      evict = {
        @CacheEvict(value = "indexes", key = "#pid"),
        @CacheEvict(value = "product", key = "#pid"),
        @CacheEvict(value = "products", allEntries = true)
      })
  @IncrementCache(name = "product_count", key = "all", value = -1)
  public void systemDeleteProduct(Long pid) {
    Product product = productDao.read(pid);

    if (product == null) {
      throw new DataStoreException("Product #" + pid + " not found in the system.");
    }

    if (product.getLocked()) {
      throw new DataStoreException(
          "Cannot delete product #" + pid + ". Product is locked in the system.");
    }
    productDao.delete(product);
  }
 @PreAuthorize("hasAnyRole('ROLE_DATA_MANAGER','ROLE_SEARCH')")
 @Transactional(readOnly = true, propagation = Propagation.REQUIRED)
 @Cacheable(value = "products", key = "#ids")
 public List<Product> getProducts(List<Long> ids) {
   return productDao.read(ids);
 }
 @Transactional(readOnly = true, propagation = Propagation.REQUIRED)
 @Cacheable(value = "product", key = "#id")
 public Product systemGetProduct(Long id) {
   return productDao.read(id);
 }