Package com.appspot.finajjarane.framework.generic

Source Code of com.appspot.finajjarane.framework.generic.GenericDaoImpl

/**
* @author Fayçal INAJJARANE
*/
package com.appspot.finajjarane.framework.generic;

import java.lang.reflect.ParameterizedType;
import java.util.List;
import java.util.logging.Logger;

import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.PersistenceContext;

import org.springframework.stereotype.Repository;


@Repository
public class GenericDaoImpl<T, PK> implements IGenericDao<T, PK> {

  // Setup loggin object
  public static final Logger log = Logger.getLogger(GenericDaoImpl.class.getName());


  @PersistenceContext
  private EntityManager em;

  // Grab used entity name
  private Class<T> entityT;


  @SuppressWarnings("unchecked")
  public GenericDaoImpl(){
    // get metadata from generics to initialize the parametrized entity (T Object)
    if(this.getClass().getGenericSuperclass() instanceof ParameterizedType){
      ParameterizedType parameterizedType = (ParameterizedType) this.getClass().getGenericSuperclass();
      entityT = (Class<T>) parameterizedType.getActualTypeArguments()[0];
    }
  }


  /**
   * Add an entity
   * @param entity
   * @return True if entity added, False otherwise
   */
  @Override
  public boolean add(final T entitythrows Exception{
    log.info("Starting the 'add()' method of " + entity.getClass().getName() + " [GenericDaoImpl]");
    em = EMFactory.get();
    EntityTransaction tx = this.em.getTransaction();
    try{
      tx.begin();
      this.em.persist(entity);

      tx.commit();
      return true;
    }
    catch(Exception e){
      if(tx.isActive()){
        tx.rollback();
      }
      log.severe("Severe error on DAO [EntityType add(" + entity.getClass().getName() + ")] : \n\t" + e.getMessage() );
      return false;
    }
    finally{
      em.close();
      log.info("Ending the 'add()' method of " + entity.getClass().getName() + " [GenericDaoImpl]");
    }
  }

  /**
   * Update an entity
   * @param entity
   * @return the added entity, or null otherwise
   */
  @Override
  public T merge(final T entity) throws Exception {
    log.info("Starting the 'merge()' method of " + entity.getClass().getName() + " [GenericDaoImpl]");

    em = EMFactory.get();
    EntityTransaction tx = this.em.getTransaction();
    try{
      tx.begin();
      this.em.persist(entity);

      tx.commit();
      return entity;
    }
    catch(Exception e){
      if(tx.isActive()){
        tx.rollback();
      }
      log.severe("Severe error on DAO [EntityType merge(" + entity.getClass().getName() + ")] : \n\t" + e.getMessage() );
      throw e;
    }
    finally{
      em.close();
      log.info("Ending the 'merge()' method of " + entity.getClass().getName() + " [GenericDaoImpl]");
    }
  }


  /**
   * Find an entity by its key
   * @param key
   * @return founded entity, null otherwise
   */
  @Override
  public T findByKey(final PK key) throws Exception {
    log.info("Starting the 'findByKey(" + key.getClass().getSimpleName() + ")' method of  [GenericDaoImpl]");

    em = EMFactory.get();
    T result;

    EntityTransaction tx = this.em.getTransaction();
    try{
      tx.begin();
      result = this.em.find(this.entityT,key);
      tx.commit();
      return result;
    }
    catch(Exception e){
      if(tx.isActive()){
        tx.rollback();
      }
      log.severe("Severe error on DAO [findByKey()] : " + e.getMessage() );
      throw e;
    }
    finally{
      em.close();
      log.info("Ending the 'findByKey(" + key.getClass().getSimpleName() + ")' method of  [GenericDaoImpl]");
    }
  }


  /**
   * Get the full list of entities
   * @return list of all founded entities
   */
  @SuppressWarnings("unchecked")
  @Override
  public List<T> findAll() throws Exception{
    log.info("Starting the 'findByKey()' method of  [GenericDaoImpl]");

    List<T> resultsList;
    em = EMFactory.get();
    EntityTransaction tx = this.em.getTransaction();
    try{
      tx.begin();
      resultsList = this.em.createQuery("select e from " + this.entityT.getClass().getSimpleName() + " e").getResultList();
      tx.commit();
      return resultsList;
    }
    catch(Exception e){
      if(tx.isActive()){
        tx.rollback();
      }
      log.severe("Severe error on DAO [findAll()] : " + e.getMessage() );
      throw e;
    }
    finally{
      em.close();
      log.info("Ending the 'findAll()' method of  [GenericDaoImpl]");
    }
  }


  /**
   * Get limited list of entities (useful for pagination)
   * @param page (the number of page in service is decreased by 1 in DAO)
   * @param maxInPage
   * @return list of all founded entities, but in limited number
   */
  @SuppressWarnings("unchecked")
  @Override
  public List<T> getLimitedList(int page, final int maxInPage, final String lang, final String orderByField, final String orderByType) throws Exception {

    em = EMFactory.get();

    page = Math.max(page, 1);

    log.info("Starting the 'getLimitedList(" + String.valueOf(page) + "," + String.valueOf(maxInPage) + ")' method of  [GenericDaoImpl]");

    List<T> resultsList;
    String orderbyExpression = "";
    String orderByExpressionType = "";
    String expressionWhereLang = "";

    if(null!=lang){
      expressionWhereLang = " WHERE e.lang='" + lang +"' ";
    }

    if(null==orderByType || orderByType.isEmpty()){
      orderByExpressionType = "ASC";
    }
    else{
      orderByExpressionType = orderByType;
    }

    if(null!=orderByField && !orderByField.isEmpty()){
      orderbyExpression = "ORDER BY e." + orderByField + " " + orderByExpressionType;
    }

    try{

      String query   = "SELECT e FROM " + this.entityT.getSimpleName() + " e "
                                        + expressionWhereLang
                                        + orderbyExpression;

      resultsList   = this.em.createQuery(query).setFirstResult((page-1) * maxInPage)
                               .setMaxResults(maxInPage)
                               .getResultList();


      return resultsList;

    }
    catch(Exception e){
      log.severe("Severe error on DAO [getLimitedList(" + String.valueOf(page) + "," + String.valueOf(maxInPage) + ")] : " + e.getMessage() );
      throw e;
    }
    finally{
      log.info("Ending the 'getLimitedList(" + String.valueOf(page) + "," + String.valueOf(maxInPage) + ")' method of  [GenericDaoImpl]");
    }
  }

  /**
   * Remove an entity
   * @param Key
   * @return True if entity removed, False otherwise
   */
  @Override
  public boolean removeByKey(final PK key) throws Exception {

    log.info("Starting the 'removeByKey(" + key.getClass().getSimpleName() + ")' method of  [GenericDaoImpl]");

    em = EMFactory.get();
    EntityTransaction tx = this.em.getTransaction();
    try{
      tx.begin();
      this.em.remove(this.em.find(this.entityT, key));
      tx.commit();
      return true;
    }
    catch(Exception e){
      if(tx.isActive()){
        tx.rollback();
      }
      log.severe("Severe error on DAO [removeByKey(" + key.getClass().getSimpleName() + ")] : " + e.getMessage() );
      throw e;
    }
    finally{
      em.close();
      log.info("Ending the 'removeByKey(" + key.getClass().getSimpleName() + ")' method of  [GenericDaoImpl]");
    }

  }

  /**
   * Get total entries count for the current entity
   * @param field
   * @param lang
   * @return int
   */
  @Override
  public int getEntriesCount(final String field, final String lang) throws Exception {

    log.info("Starting the 'getEntriesCount()' method of " + this.entityT.getClass().getSimpleName() + "  [GenericDaoImpl]");

    em = EMFactory.get();
    String expressionWhereLang = "";

    if(null!=lang){
      expressionWhereLang = " WHERE e.lang='" + lang +"' ";
    }

    String query = "SELECT count(:field) FROM " + this.entityT.getSimpleName() + " e " + expressionWhereLang;

    try {
      Integer result = (Integer) em.createQuery(query)
                        .setParameter("field", field)
                        .getSingleResult();

      return result.intValue();
    }
    catch (Exception e) {
      log.severe("Severe error on DAO [getEntriesCount() of " + this.entityT.getClass().getSimpleName() + "] : " + e.getMessage());
      throw e;
    }
    finally{
      log.info("Ending the 'getEntriesCount()' method of " + this.entityT.getClass().getSimpleName() + "  [GenericDaoImpl]");
    }

  }

}
TOP

Related Classes of com.appspot.finajjarane.framework.generic.GenericDaoImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.