InventoryMgmtEJB.java
package ejava.examples.ejbwar.inventory.ejb;
import java.util.List;
import java.util.UUID;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ejava.examples.ejbwar.inventory.bo.Categories;
import ejava.examples.ejbwar.inventory.bo.Category;
import ejava.examples.ejbwar.inventory.bo.Product;
import ejava.examples.ejbwar.inventory.bo.Products;
import ejava.examples.ejbwar.inventory.cdi.Inventory;
import ejava.examples.ejbwar.inventory.dao.InventoryDAO;
/**
* This class implements the core transactional business logic for the
* inventory management. It is implemented as a no interface @Stateless
* session bean and has JAX-RS and RMI facades that deal with technology-
* specific communications with remote clients.
*/
@Stateless
public class InventoryMgmtEJB {
private static final Logger logger = LoggerFactory.getLogger(InventoryMgmtEJB.class);
@Inject
private InventoryDAO dao;
@Inject @Inventory
private EntityManager em; //used for demo
/**
* Returns a list of categories that match the name provided
* @param name
* @return
*/
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public Categories findCategoryByName(String name, int offset, int limit) {
List<Category> categories = dao.findCategoryByName("%" + name + "%", offset, limit);
for (Category category : categories) {
category.setProductCount(categories.size());
dao.detachCategory(category); //detach before manipulating collection
category.setProducts(null);
}
return new Categories(categories, 0, 0);
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public Category createOrGetCategory(String name) {
List<Category> categories = dao.findCategoryByName(name, 0, 1);
if (categories.size()==0) {
Category category=new Category(name);
dao.createCategory(category);
return category;
}
else {
return categories.get(0);
}
}
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public Category getCategory(int id) {
return dao.getCategory(id);
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void deleteCategory(int id) {
Category category = dao.getCategory(id);
if (category != null) {
dao.deleteCategory(category);
}
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public Product addProduct(Product product, String categoryName) {
product.setProtectedValue(UUID.randomUUID().toString());
dao.addProduct(product);
Category category = createOrGetCategory(categoryName);
category.getProducts().add(product);
product = dao.getProduct(product.getId());
return product;
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public Product updateProduct(Product product) {
logger.info("updating existing product: {}", dao.getProduct(product.getId()));
logger.info("to these values: {}", product);
dao.updateProduct(product);
em.flush();
em.clear();
Product dbResult = dao.getProduct(product.getId());
logger.info("resulting product: {}", dbResult);
return dbResult;
}
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public Products findProductByName(String name, int offset, int limit) {
return new Products(dao.findProductsByName("%" + name + "%", offset, limit), offset, limit);
}
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public Product getProduct(int id) {
return dao.getProduct(id);
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void deleteProduct(Product product) {
dao.deleteProduct(product);
}
}