com.miranteinfo.seam.framework.dao.DaoSupport.java Source code

Java tutorial

Introduction

Here is the source code for com.miranteinfo.seam.framework.dao.DaoSupport.java

Source

/*
  * Mirante Tecnologia
  * Copyright 2010, Mirante Informatica LTDA, 
  * and individual contributors as indicated by the @authors tag
  *
  * This is free software; you can redistribute it and/or modify it
  * under the terms of the GNU Lesser General Public License as
  * published by the Free Software Foundation; either version 2.1 of
  * the License, or (at your option) any later version.
  *
  * This software is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with this software; if not, write to the Free
  * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
  */
package com.miranteinfo.seam.framework.dao;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Collection;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.jboss.seam.Component;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.contexts.Contexts;
import org.jboss.seam.log.Log;

import com.miranteinfo.seam.framework.util.SearchSort;
import com.miranteinfo.seam.hibernate.BaseEntity;

/**
 * Classe suporte a todos os DAOs do projeto. Implementa uma serie de metodos que facilitam o 
 * desenvolvimento.
 *  
 * @author lucas lins
 *
 * @param <T>
 * @param <PK>
 */
@SuppressWarnings("unchecked")
public abstract class DaoSupport<T extends BaseEntity, PK extends Serializable> {

    private static final long serialVersionUID = 1L;

    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // ATTRIBUTES
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    @Logger
    protected Log log;

    private Session session;

    protected Class<T> tipo;

    public static final String DAO_SUPPORT_FIRST_RESULT_PARAM = "DAO_SUPPORT_FIRST_RESULT_PARAM";
    public static final String DAO_SUPPORT_MAX_RESULTS_PARAM = "DAO_SUPPORT_MAX_RESULTS_PARAM";

    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // CONSTRUCTORS
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    /**
     * Construtor que ja obtem de forma automatica o tipo do DAO.
     */
    public DaoSupport() {
        Type superclass = getClass().getGenericSuperclass();
        if (superclass instanceof ParameterizedType) {
            ParameterizedType parameterizedType = (ParameterizedType) superclass;
            if (parameterizedType.getActualTypeArguments().length > 0) {
                tipo = (Class<T>) parameterizedType.getActualTypeArguments()[0];
            }
        }
    }

    /**
     * Construtor que recebe o tipo do DAO
     * @param tipo
     */
    public DaoSupport(Class<T> tipo) {
        this.tipo = tipo;
    }

    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // PROTECTED METHODS
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    /**
     * Talvez voce queira sobrescrever este metodo para passar o nome correto de sua session.
     * Por default o nome eh "session".
     * 
     * @return sessionName
     */
    protected String getSessionName() {
        return "session";
    }

    /**
     * Metodo responsavel por retornar a sessao do hibernate.
     * 
     * @return hibernate session
     */
    protected Session getSession() {
        if (session == null) {
            session = (Session) Component.getInstance(getSessionName());

            if (session == null) {
                throw new RuntimeException("No session was configured to use with this component.");
            }
        }

        return session;
    }

    /**
     * Faz a pesquisa paginada com os parametros da paginacao obtidos da requisicao.
     * @param criteria
     * @return lista
     */
    protected List listPaged(Criteria criteria) {
        criteria.setFirstResult((Integer) Contexts.getEventContext().get(DAO_SUPPORT_FIRST_RESULT_PARAM));
        criteria.setMaxResults((Integer) Contexts.getEventContext().get(DAO_SUPPORT_MAX_RESULTS_PARAM));
        return criteria.list();
    }

    /**
     * Faz a pesquisa paginada com os parametros da paginacao obtidos da requisicao.
     * @param criteria
     * @return lista
     */
    protected List listPaged(Query query) {
        query.setFirstResult((Integer) Contexts.getEventContext().get(DAO_SUPPORT_FIRST_RESULT_PARAM));
        query.setMaxResults((Integer) Contexts.getEventContext().get(DAO_SUPPORT_MAX_RESULTS_PARAM));
        return query.list();
    }

    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // PUBLIC METHODS
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    /**
     * Metodo Responsavel por salvar um novo objeto na base de dados 
     * 
     * @param obj objeto a ser persistido
     */
    public PK save(T novoObj) {
        return (PK) getSession().save(novoObj);
    }

    /**
     * Metodo Responsavel por salvar [ou alterar] um objeto na base de dados, a escolha a
     * feita com base na verificacao se o objeto ja corresponde a um objeto persistente. 
     * 
     * @param obj objeto a ser persistido
     */
    public void saveOrUpdate(T... objs) {
        for (T t : objs) {
            getSession().saveOrUpdate(t);
        }
    }

    /**
     * Metodo Responsavel por salvar [ou alterar] um objeto na base de dados, a escolha e
     * feita com base na verificacao se o objeto corresponde a um objeto persistente. 
     * 
     * @param obj objeto a ser persistido
     */
    public void saveOrUpdate(Collection<T> objs) {
        for (T t : objs) {
            getSession().saveOrUpdate(t);
        }
    }

    /**
     * Metodo responsavel por excluir uma lista de entidades da base de dados
     * 
     * @param ids Identificadores das entidades a serem removidas da base de dados
     */
    public void delete(PK... ids) {
        if (ids != null && ids.length > 0) {
            for (PK id : ids) {
                if (id != null) {
                    T obj = retrieve(id);
                    if (obj != null) {
                        Object objMerged = getSession().merge(obj);
                        getSession().delete(objMerged);
                    }
                }
            }
        }
    }

    /**
     * Metodo Responsavel por excluir um conjunto de entidades persistentes da base de dados
     * 
     * @param objs Objetos a serem removidos da base de dados
     */
    public void delete(T... objs) {
        for (T t : objs) {
            Object objMerged = getSession().merge(t);
            getSession().delete(objMerged);
        }
    }

    /**
     * Metodo Responsavel por excluir um conjunto de entidades persistentes da base de dados
     * 
     * @param objs Objetos a serem removidos da base de dados
     */
    public void delete(Collection<T> objs) {
        for (T t : objs) {
            Object objMerged = getSession().merge(t);
            getSession().delete(objMerged);
        }
    }

    /**
     * Metodo responsavel por alterar os dados de um objeto ja persistido no banco de dados
     * 
     * @param obj Objeto a ser alterado na base de dados
     */
    public void update(T... objs) {
        saveOrUpdate(objs);
    }

    /**
     * Metodo responsavel por recuperar um objeto da base de dados
     * 
     * @param id Identificador do objeto a ser recuperado
     * @return Objeto referente ao identificador informado
     */
    public T retrieve(PK id) {
        return (T) getSession().get(tipo, id);
    }

    /**
     * Metodo responsavel por recuperar todos os objeto de uma tabela da base de dados
     * 
     * @return todos os objetos da classe
     */
    public List<T> retrieveAll() {
        return getSession().createCriteria(tipo).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
    }

    /**
     * Metodo Responsavel por recuperar todos os objeto de uma tabela da base de dados de forma ordenada
     * 
     * @param sort asc - ascending or desc - descending
     * @param propertyName property to be ordered
     * @return todos os objetos da classe
     */
    public List<T> retrieveAll(SearchSort sort, String... propertiesName) {
        Criteria criteria = getSession().createCriteria(tipo);
        if (SearchSort.ASCENDING.equals(sort)) {
            for (String property : propertiesName) {
                criteria.addOrder(Order.asc(property));
            }
        } else if (SearchSort.DESCENDING.equals(sort)) {
            for (String property : propertiesName) {
                criteria.addOrder(Order.desc(property));
            }
        }
        return criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
    }

    /**
     * Metodo responsavel por recuperar todos os objeto de uma tabela da base de dados
     * 
     * @param nome da propriedade, valor da propriedade(filtro), tipo de busca (comeca ou contem)
     * @return todos os objetos da classe que se adequam aos filtros
     */
    public List<T> retrieveByProperty(String propertyName, Object value) {
        return getSession().createCriteria(tipo).add(Restrictions.eq(propertyName, value)).list();
    }

    /**
     * Metodo responsavel por recuperar todos os objeto de uma tabela da base de dados
     * 
     * @param nome da propriedade, valor da propriedade(filtro), tipo de busca (comeca ou contem)
     * @return todos os objetos da classe que se adequam aos filtros
     */
    public List<T> retrieveByProperty(String propertyName, String value) {
        return retrieveByProperty(propertyName, value, null);
    }

    /**
     * Metodo responsavel por recuperar todos os objeto de uma tabela da base de dados
     * 
     * @param nome da propriedade, valor da propriedade(filtro), tipo de busca (comeca ou contem)
     * @return todos os objetos da classe que se adequam aos filtros
     */
    public List<T> retrieveByProperty(String propertyName, String value, MatchMode matchMode) {
        if (matchMode != null) {
            return getSession().createCriteria(tipo).add(Restrictions.ilike(propertyName, value, matchMode)).list();
        } else {
            return getSession().createCriteria(tipo).add(Restrictions.ilike(propertyName, value, MatchMode.EXACT))
                    .list();
        }
    }

    /**
     * Metodo responsavel por recuperar todos os objetos de uma tabela da base de dados de acordo
     * com o exemplo passado. 
     * 
     * @param filtro
     * @return lista
     */
    public List<T> retrieveByExample(T filtro) {
        return retrieveByExample(filtro, null, false);
    }

    /**
     * Metodo responsavel por recuperar todos os objetos de uma tabela da base de dados de acordo
     * com o exemplo passado. 
     * 
     * @param filtro
     * @param matchMode
     * @param ignoreCase
     * @return lista
     */
    public List<T> retrieveByExample(T filtro, MatchMode matchMode, boolean ignoreCase) {
        Example example = Example.create(filtro);

        if (matchMode != null) {
            example = example.enableLike(matchMode);
        }

        if (ignoreCase) {
            example = example.ignoreCase();
        }

        return getSession().createCriteria(tipo).add(example).list();
    }

    /**
     * Metodo Responsavel por fazer o merge com um objeto na base de dados, a escolha 
     * 
     * @param obj objeto a ser sincronizado
     * @return objeto sincronizado com a base
     */
    public T merge(T novoObj) {
        T objMerged = (T) getSession().merge(novoObj);
        return objMerged;
    }

    /**
     * Metodo responsavel por sincronizar um objeto da sessao com o atual no banco.
     * 
     * @param obj objeto para refresh
     */
    public void refresh(T obj) {
        getSession().refresh(obj);
    }

    /**
     * Metodo responsavel por remover um objeto da sessao.
     * 
     * @param obj objeto para remocao
     */
    public void evict(T obj) {
        getSession().evict(obj);
    }

}