com.miranteinfo.seam.framework.service.GenericRetrieveService.java Source code

Java tutorial

Introduction

Here is the source code for com.miranteinfo.seam.framework.service.GenericRetrieveService.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.service;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
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.AutoCreate;
import org.jboss.seam.annotations.Install;

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

/**
 * Service generico criado para facil utilizacao de metodos de busca das entidades.
 * Observe que a {@link GenericRetrieveService} nao extende a {@link ServiceSupport}, uma vez 
 * que nao necessita de transacao em metodos de pesquisa.
 * 
 * @author lucas lins
 * 
 */
@AutoCreate
@Install(false)
@SuppressWarnings("unchecked")
public class GenericRetrieveService {

    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    // CONFIG
    // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    private Session session;

    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;
    }

    /**
     * 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";
    }

    public void setSession(Session session) {
        this.session = session;
    }

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

    /**
     * Retorna a entidade do tipo <T>, cujo id foi informado.
     * @param <T>
     * @param classe
     * @param id
     * @return entidade
     */
    public <T extends BaseEntity> T retrieve(Class<T> classe, Serializable id) {
        return (T) getSession().get(classe, id);
    }

    /**
     * Retorna a lista de entidades do tipo <T>
     * @param <T>
     * @param classe
     * @return lista de entidades
     */
    public <T extends BaseEntity> List<T> retrieveAll(Class<T> classe) {
        return getSession().createCriteria(classe).setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
    }

    /**
     * Retorna a lista de entidades do tipo <T> ordenada pelas propriedades informadas, nesta ordem.
     * @param <T>
     * @param classe
     * @param sort
     * @param propertiesName
     * @return lista de entidades ordadenadas
     */
    public <T extends BaseEntity> List<T> retrieveAll(Class<T> classe, SearchSort sort, String... propertiesName) {
        Criteria criteria = getSession().createCriteria(classe);
        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();
    }

    /**
     * Retorna a lista de entidades do tipo <T> filtradas pelos parametros informados
     * @param <T>
     * @param classe
     * @param propertyName
     * @param value
     * @return lista de entidades
     */
    public <T extends BaseEntity> List<T> retrieveByProperty(Class<T> classe, String propertyName, Object value) {
        return getSession().createCriteria(classe).add(Restrictions.eq(propertyName, value)).list();
    }

    /**
     * Retorna a lista de entidades do tipo <T> filtradas pelos parametros informados. Difere do metodo
     * retrieveByProperty(Class<T> classe, String propertyName, Object value) pelo ultimo parametro definido ja como 
     * String e utiliza o {@link MatchMode} exato para a busca. 
     * 
     * @param <T>
     * @param classe
     * @param propertyName
     * @param value
     * @return
     */
    public <T extends BaseEntity> List<T> retrieveByProperty(Class<T> classe, String propertyName, String value) {
        return retrieveByProperty(classe, propertyName, value, null);
    }

    /**
     * Retorna a lista de entidades filtradas pelos parametros informadas.
     * 
     * @param <T>
     * @param classe
     * @param propertyName
     * @param value
     * @param matchMode
     * @return lista de entidades.
     */
    public <T extends BaseEntity> List<T> retrieveByProperty(Class<T> classe, String propertyName, String value,
            MatchMode matchMode) {
        if (matchMode != null) {
            return getSession().createCriteria(classe).add(Restrictions.ilike(propertyName, value, matchMode))
                    .list();
        } else {
            return getSession().createCriteria(classe).add(Restrictions.ilike(propertyName, value, MatchMode.EXACT))
                    .list();
        }
    }

    /**
     * Retorna a lista de entidades filtradas pelo exemplo passado.
     * @param <T>
     * @param classe
     * @param filtro
     * @return lista de entidades
     */
    public <T extends BaseEntity> List<T> retrieveByExample(Class<T> classe, BaseEntity filtro) {
        return retrieveByExample(classe, filtro, null, false);
    }

    /**
     * Retorna a lista de entidades filtradas pelos parametros informados
     * @param <T>
     * @param classe
     * @param filtro
     * @param matchMode
     * @param ignoreCase
     * @return lista de entidades
     */
    public <T extends BaseEntity> List<T> retrieveByExample(Class<T> classe, BaseEntity 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(classe).add(example).list();
    }
}