package au.edu.uts.aip.mandreacchio.ejb;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import au.edu.uts.aip.mandreacchio.jpa.Order;
import au.edu.uts.aip.mandreacchio.jpa.Status;
public class OrderDAOJpaImpl implements OrderDAO {
@PersistenceContext
private EntityManager em;
// this is the default constructor
public OrderDAOJpaImpl() {
this("store");
}
public OrderDAOJpaImpl(String unitName) {
EntityManagerFactory emf = Persistence
.createEntityManagerFactory(unitName);
em = emf.createEntityManager();
}
// this is the special constructor to set the entity manager.
// this is used when we run with EJB3
public OrderDAOJpaImpl(EntityManager em) {
this.em = em;
}
public void setEntityManager(EntityManager em) {
this.em = em;
}
// Start Methods
@Override
public Order createOrder(Order o) {
em.getTransaction().begin();
em.persist(o);
// o.setCustomerRefNumber("11158704-" + o.getId());
em.flush();
// testing Commit
// em.getTransaction().commit();
return o;
}
@Override
public Order getOrderById(int id) {
Order result = (Order) em.getReference(Order.class, id);
return result;
}
@Override
public Order getOrderByLastNameAndCRN(String crn, String lastName) {
Order result;
Integer orderId = Order.crnToOrderId(crn);
if (orderId == null) {
return result = null;
}
// If problems come up again, this could help: select p FROM Person p
// left join fetch p.address
try {
result = (Order) em
.createQuery(
"SELECT o FROM Order o INNER JOIN o.customer c WHERE c.lastName = ?1 AND o.id = ?2")
.setParameter(1, lastName).setParameter(2, orderId)
.getSingleResult();
} catch (Exception e) {
result = null;
}
// LazyLoading error workaround
// result.getCustomer();
if (result != null){
result.getOrderLines().size();
}
// result.getStatus().getStatus();
return result;
}
@Override
public List<Order> getAllOrders() {
@SuppressWarnings("unchecked")
List<Order> results = em.createQuery("select O from Order O")
.getResultList();
return results;
}
// TODO This should probably be "get order by status"
@Override
public List<Order> getAllOrderedPaidOrders() {
StatusDAO sdao = new StatusDAOJpaImpl();
Status s = sdao.getStatusById(3);
@SuppressWarnings("unchecked")
List<Order> results = em
.createQuery(
"SELECT o FROM Order o INNER JOIN o.status s WHERE s.status != ?1")
.setParameter(1, s.getStatus()).getResultList();
// LazyLoading error workaround
for (Order o : results) {
o.getCustomer();
o.getOrderLines().size();
o.getStatus();
}
return results;
}
@Override
public Order getOrderByCRN(String crn) {
Order result;
// Convert CRN to OrderID
Integer orderId = Order.crnToOrderId(crn);
if (orderId == null) {
return result = null;
}
try {
result = (Order) em
.createQuery("SELECT o FROM Order o WHERE o.id = ?1")
.setParameter(1, orderId).getSingleResult();
} catch (Exception e) {
result = null;
}
return result;
}
@Override
public List<Order> getAllPaidOrders() {
StatusDAO sdao = new StatusDAOJpaImpl();
Status s = sdao.getStatusById(2);
@SuppressWarnings("unchecked")
List<Order> results = em
.createQuery(
"SELECT o FROM Order o INNER JOIN o.status s WHERE s.status = ?1")
.setParameter(1, s.getStatus()).getResultList();
return results;
}
@Override
public void updateStatusByCRN(int statusId, String crn) {
StatusDAO sdao = new StatusDAOJpaImpl();
Status status = sdao.getStatusById(statusId);
int orderId = Order.crnToOrderId(crn);
try {
em.getTransaction().begin();
em.createQuery(
"UPDATE Order o SET o.status = :status WHERE o.id = :orderId")
.setParameter("status", status)
.setParameter("orderId", orderId).executeUpdate();
em.getTransaction().commit();
em.clear();
} catch (Exception e) {
e.printStackTrace();
}
return;
}
}