CatalogImpl.java

package ejava.examples.blpurchase.blimpl;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ejava.examples.blpurchase.bl.Catalog;
import ejava.examples.blpurchase.bo.Account;
import ejava.examples.blpurchase.bo.Cart;
import ejava.examples.blpurchase.bo.Product;

public class CatalogImpl implements Catalog {
	private static final Logger logger = LoggerFactory.getLogger(CatalogImpl.class);
	private EntityManager em;

	public void setEntityManager(EntityManager entityManager) {
		em = entityManager;
	}

	@Override
	public List<Product> getProducts(int offset, int limit) {
		TypedQuery<Product> query = em.createNamedQuery(Product.GET_PRODUCTS_QUERY, Product.class);
		if (offset > 0) {
			query.setFirstResult(offset);
		}
		if (limit > 0) {
			query.setMaxResults(limit);
		}
		return query.getResultList();
	}

	@Override
	public int addToCart(int id, String email) {
		Product product = em.find(Product.class, id);
		if (product == null) {
			logger.warn("product not found: {}", id);
			return 0;
		}
		if (product.getCount()-1 < 0) {
			logger.warn("no product left");
			return 0;
		}
		product.setCount(product.getCount()-1);

		Cart cart = em.find(Cart.class, email);
		if (cart == null) {
			List<Account> accounts = em.createNamedQuery(
					Account.FIND_BY_EMAIL_QUERY, Account.class)
					.setParameter("email", email)
					.getResultList();
			if (accounts.size() == 0) {
				logger.warn("no account found for: {}", email);
				return 0;
			}
			cart = new Cart(accounts.get(0));
			em.persist(cart);
		}
		cart.getProducts().add(product);
		
		return cart.getProducts().size();
	}
}