/** * * * This class implements the core functionalities of save, delete, find and update operations on tables of * the aidr_predict DB for local EJB access only. * * @author Koushik */ package qa.qcri.aidr.dbmanager.ejb.local.facade.impl; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.ejb.Stateless; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.apache.log4j.Logger; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.LockOptions; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Order; import org.hibernate.criterion.Projection; import org.hibernate.criterion.ProjectionList; import org.hibernate.criterion.Projections; import org.hibernate.sql.JoinType; import qa.qcri.aidr.dbmanager.ejb.local.facade.CoreDBServiceFacade; @Stateless(name = "CoreDBServiceFacadeImp") public class CoreDBServiceFacadeImp<E extends Serializable, I extends Serializable> implements CoreDBServiceFacade<E,I> { @PersistenceContext(unitName = "qa.qcri.aidr.dbmanager-EJBS") protected EntityManager em; private static final Logger logger = Logger.getLogger("db-manager-log"); private Class<E> entityClass; public CoreDBServiceFacadeImp(Class<E> entityClass) { this.entityClass = entityClass; } public CoreDBServiceFacadeImp() {} @Override public EntityManager getEntityManager() { try { return em; } catch (Exception e) { logger.error("getEntityManager failed", e); throw new HibernateException("getEntityManager failed"); } } @Override public int setEntityManager(EntityManager em) { try { if (null == this.em) { this.em = em; logger.info("EntityManager set to new value: " + this.em); return 1; } else logger.info("Skipping setter, since EntityManager already initialized to :" + this.em); return 0; } catch (Exception e) { logger.error("EntityManager setting exception : " + em, e); throw new HibernateException("setEntityManager failed"); } } @Override public Session getCurrentSession() { try { return em.unwrap(Session.class); } catch (Exception e) { logger.error("getCurrentSession failed", e); throw new HibernateException("getCurrentSession failed"); } } @SuppressWarnings("unchecked") @Override public E getById(I id) { try { return (E) getCurrentSession().get(entityClass, id); } catch (Exception e) { logger.error("getById failed, id = " + id, e); throw new HibernateException("getById failed, id = " + id); } } @SuppressWarnings("unchecked") @Override public E getByCriterionID(Criterion criterion) { try { Criteria criteria = getCurrentSession().createCriteria(entityClass); criteria.add(criterion); return (E) criteria.uniqueResult(); } catch (Exception e) { logger.error("getByCriterionID failed, criteria = " + criterion.toString(), e); throw new HibernateException("getByCriterionID failed, criteria = " + criterion.toString()); } } @SuppressWarnings("unchecked") @Override public E getByCriteria(Criterion criterion) { try { Criteria criteria = getCurrentSession().createCriteria(entityClass); criteria.add(criterion); List<E> fetchedList = criteria.list(); return (fetchedList != null && !fetchedList.isEmpty()) ? (E) fetchedList.get(0) : null; } catch (Exception e) { logger.error("getByCriteria failed, criteria = " + criterion.toString(), e); throw new HibernateException("getByCriteria failed, criteria = " + criterion.toString()); } } @SuppressWarnings("unchecked") @Override public List<E> getAll() { Criteria criteria = getCurrentSession().createCriteria(entityClass); List<E> fetchedList = new ArrayList<E>(); try { fetchedList = criteria.list(); return fetchedList; } catch (Exception e) { logger.error("getAll failed", e); throw new HibernateException("getAll failed"); } } @SuppressWarnings("unchecked") @Override public List<E> getAllByCriteria(Criterion criterion) { List<E> fetchedList = new ArrayList<E>(); Session session = getCurrentSession(); Criteria criteria = session.createCriteria(entityClass); criteria.add(criterion); try { fetchedList = criteria.list(); return fetchedList; } catch (Exception e) { logger.error("getAllByCriteria failed, criteria = " + criterion.toString(), e); throw new HibernateException("getAllByCriteria failed, criteria = " + criterion.toString()); } } @SuppressWarnings("unchecked") @Override public List<E> getByCriteriaWithLimit(Criterion criterion, Integer count) { List<E> fetchedList = new ArrayList<E>(); Session session = getCurrentSession(); Criteria criteria = session.createCriteria(entityClass); criteria.add(criterion); if(count != null && count > 0){ criteria.setMaxResults(count); } try { fetchedList = criteria.list(); return fetchedList; } catch (Exception e) { logger.error("getByCriteriaWithLimit failed, criteria = " + criterion.toString(), e); throw new HibernateException("getByCriteriaWithLimit failed, criteria = " + criterion.toString()); } } @SuppressWarnings("unchecked") @Override public List<E> getByCriteriaByOrder(Criterion criterion, String order, String[] orderBy, Integer count) { List<E> fetchedList = new ArrayList<E>(); Session session = getCurrentSession(); Criteria criteria = session.createCriteria(entityClass); criteria.add(criterion); for(int i = 0; i< orderBy.length; i++){ if (order != null && order.equalsIgnoreCase("desc")) { criteria.addOrder(Order.desc(orderBy[i])); } else { criteria.addOrder(Order.asc(orderBy[i])); } } if(count != null && count > 0){ criteria.setMaxResults(count); } try { fetchedList = criteria.list(); return fetchedList; } catch (Exception e) { logger.error("getByCriteriaWithLimit failed, criteria = " + criterion.toString(), e); throw new HibernateException("getByCriteriaByOrder failed, criteria = " + criterion.toString()); } } @SuppressWarnings("unchecked") @Override public List<E> getByCriteriaWithAliasByOrder(Criterion criterion, String order, String[] orderBy, Integer count, String aliasTable, Criterion aliasCriterion) { Session session = getCurrentSession(); List<E> fetchedList = new ArrayList<E>(); //logger.info("Entity: " + entityClass + ", current Session = " + session); Criteria criteria = session.createCriteria(entityClass); criteria.add(criterion); criteria.createAlias(aliasTable, aliasTable, org.hibernate.sql.JoinType.LEFT_OUTER_JOIN).add(aliasCriterion); if (orderBy != null) { for(int i = 0; i< orderBy.length; i++){ if (order != null && order.equalsIgnoreCase("desc")) { criteria.addOrder(Order.desc(orderBy[i])); } else { criteria.addOrder(Order.asc(orderBy[i])); } } } if(count != null && count > 0){ criteria.setMaxResults(count); } try { fetchedList = criteria.list(); return fetchedList; } catch (Exception e) { logger.error("getByCriteriaWithAliasByOrder failed, criteria = " + criterion.toString(), e); throw new HibernateException("getByCriteriaWithAliasByOrder failed, criteria = " + criterion.toString()); } } @SuppressWarnings("unchecked") @Override public List<E> getByCriteriaWithInnerJoinByOrder(Criterion criterion, String order, String[] orderBy, Integer count, String aliasTable, Criterion aliasCriterion) { Session session = getCurrentSession(); List<E> fetchedList = new ArrayList<E>(); //logger.info("Entity: " + entityClass + ", current Session = " + session); Criteria criteria = session.createCriteria(entityClass); criteria.add(criterion); criteria.createAlias(aliasTable, aliasTable, org.hibernate.sql.JoinType.INNER_JOIN).add(aliasCriterion); if (orderBy != null) { for(int i = 0; i< orderBy.length; i++){ if (order != null && order.equalsIgnoreCase("desc")) { criteria.addOrder(Order.desc(orderBy[i])); } else { criteria.addOrder(Order.asc(orderBy[i])); } } } if(count != null && count > 0){ criteria.setMaxResults(count); } try { fetchedList = criteria.list(); return fetchedList; } catch (Exception e) { logger.error("getByCriteriaWithInnerJoinByOrder failed, criteria = " + criterion.toString(), e); throw new HibernateException("getByCriteriaWithInnerJoinByOrder failed, criteria = " + criterion.toString()); } } @Override public void update(E e) { try { Session session = getCurrentSession(); session.saveOrUpdate(e); session.flush(); session.evict(e); } catch (Exception ex) { logger.error("Update failed", ex); throw new HibernateException("Update failed"); } } @Override public void update(List<E> entityCollection) { Session session = getCurrentSession(); Transaction tx = null; try { tx = session.beginTransaction(); for (E e: entityCollection) { session.saveOrUpdate(e); session.flush(); session.evict(e); } if (!tx.wasCommitted()) tx.commit(); } catch (Exception ex) { logger.error("Update list failed", ex); tx.rollback(); throw new HibernateException("Update list failed"); } } @SuppressWarnings("unchecked") @Override public I save(E e) { try { Session session = getCurrentSession(); I id = (I) session.save(e); session.flush(); session.evict(e); return id; } catch (Exception ex) { logger.error("Save failed", ex); throw new HibernateException("Save failed"); } } @Override public Object merge(E e) { try { Session session = getCurrentSession(); Object o = (Object) session.merge(e); session.flush(); session.evict(e); return o; } catch (Exception ex) { logger.error("Merge failed", ex); throw new HibernateException("Merge failed"); } } @Override public void merge(List<E> entityCollection) { Session session = getCurrentSession(); Transaction tx = null; try { tx = session.beginTransaction(); for (E e: entityCollection) { session.merge(e); session.flush(); session.evict(e); } if (!tx.wasCommitted()) tx.commit(); } catch (Exception ex) { logger.error("Merge list failed", ex); tx.rollback(); throw new HibernateException("Merge list failed"); } } @Override public void save(List<E> entityCollection) { Session session = getCurrentSession(); Transaction tx = null; try { tx = session.beginTransaction(); for (E e: entityCollection) { session.save(e); session.flush(); session.evict(e); } if (!tx.wasCommitted()) tx.commit(); } catch (Exception ex) { logger.error("Save list failed", ex); tx.rollback(); throw new HibernateException("Save list failed"); } } @Override public void delete(E e) { try { Session session = getCurrentSession(); session.buildLockRequest(LockOptions.UPGRADE).lock(e); session.delete(e); session.flush(); session.evict(e); } catch (Exception ex) { logger.error("Delete failed", ex); throw new HibernateException("Delete failed"); } } @Override public void delete(List<E> entityCollection) { Session session = getCurrentSession(); Transaction tx = null; try { tx = session.beginTransaction(); for (E e: entityCollection) { session.buildLockRequest(LockOptions.UPGRADE).lock(e); session.delete(e); session.flush(); session.evict(e); } if (!tx.wasCommitted()) tx.commit(); } catch (Exception ex) { logger.error("Delete list failed", ex); tx.rollback(); throw new HibernateException("Delete list failed"); } } @Override public void deleteByCriteria(Criterion criterion) { try { List<E> entityCollection = getAllByCriteria(criterion); delete(entityCollection); } catch (Exception ex) { logger.error("Delete by criteria failed", ex); throw new HibernateException("Delete by criteria failed"); } } public Criteria createCriteria(Criterion criterion, String order, String[] orderBy, Integer count, String aliasTable, Criterion aliasCriterion, Projection[] projections, JoinType joinType) { Session session = getCurrentSession(); List fetchedList = new ArrayList(); //logger.info("Entity: " + entityClass + ", current Session = " + session); Criteria criteria = session.createCriteria(entityClass); criteria.add(criterion); criteria.createAlias(aliasTable, aliasTable, joinType).add(aliasCriterion); if (orderBy != null) { for(int i = 0; i< orderBy.length; i++){ if (order != null && order.equalsIgnoreCase("desc")) { criteria.addOrder(Order.desc(orderBy[i])); } else { criteria.addOrder(Order.asc(orderBy[i])); } } } if(count != null && count > 0){ criteria.setMaxResults(count); } // set projections setProjections(criteria, projections); return criteria; } private void setProjections(Criteria criteria, Projection[] projections) { ProjectionList projList = Projections.projectionList(); if(projections != null && projections.length > 0) { for(Projection projection : projections) { projList.add(projection); } criteria.setProjection(projList); } } }