br.gov.jfrj.siga.dp.dao.CpDao.java Source code

Java tutorial

Introduction

Here is the source code for br.gov.jfrj.siga.dp.dao.CpDao.java

Source

/*******************************************************************************
 * Copyright (c) 2006 - 2011 SJRJ.
 * 
 *     This file is part of SIGA.
 * 
 *     SIGA is free software: you can redistribute it and/or modify
 *     it under the terms of the GNU General Public License as published by
 *     the Free Software Foundation, either version 3 of the License, or
 *     (at your option) any later version.
 * 
 *     SIGA 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 General Public License for more details.
 * 
 *     You should have received a copy of the GNU General Public License
 *     along with SIGA.  If not, see <http://www.gnu.org/licenses/>.
 ******************************************************************************/
/*
 * Criado em  01/12/2005
 *
 * Window - Preferences - Java - Code Style - Code Templates
 */
package br.gov.jfrj.siga.dp.dao;

import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
import net.sf.ehcache.config.CacheConfiguration;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.StatelessSession;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.DefaultNamingStrategy;
import org.hibernate.criterion.LogicalExpression;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Property;
import org.hibernate.criterion.Restrictions;
import org.hibernate.jdbc.Work;

import br.gov.jfrj.siga.base.AplicacaoException;
import br.gov.jfrj.siga.base.DateUtils;
import br.gov.jfrj.siga.cp.CpConfiguracao;
import br.gov.jfrj.siga.cp.CpGrupo;
import br.gov.jfrj.siga.cp.CpGrupoDeEmail;
import br.gov.jfrj.siga.cp.CpIdentidade;
import br.gov.jfrj.siga.cp.CpModelo;
import br.gov.jfrj.siga.cp.CpPerfil;
import br.gov.jfrj.siga.cp.CpServico;
import br.gov.jfrj.siga.cp.CpSituacaoConfiguracao;
import br.gov.jfrj.siga.cp.CpTipoConfiguracao;
import br.gov.jfrj.siga.cp.CpTipoGrupo;
import br.gov.jfrj.siga.cp.CpTipoIdentidade;
import br.gov.jfrj.siga.cp.CpTipoPapel;
import br.gov.jfrj.siga.cp.CpUnidadeMedida;
import br.gov.jfrj.siga.cp.bl.Cp;
import br.gov.jfrj.siga.cp.bl.CpAmbienteEnumBL;
import br.gov.jfrj.siga.cp.bl.CpConfiguracaoBL;
import br.gov.jfrj.siga.cp.bl.CpPropriedadeBL;
import br.gov.jfrj.siga.cp.bl.SituacaoFuncionalEnum;
import br.gov.jfrj.siga.cp.model.HistoricoAuditavel;
import br.gov.jfrj.siga.dp.CpAplicacaoFeriado;
import br.gov.jfrj.siga.dp.CpFeriado;
import br.gov.jfrj.siga.dp.CpLocalidade;
import br.gov.jfrj.siga.dp.CpMarcador;
import br.gov.jfrj.siga.dp.CpOrgao;
import br.gov.jfrj.siga.dp.CpOrgaoUsuario;
import br.gov.jfrj.siga.dp.CpPersonalizacao;
import br.gov.jfrj.siga.dp.CpTipoLotacao;
import br.gov.jfrj.siga.dp.CpTipoPessoa;
import br.gov.jfrj.siga.dp.CpUF;
import br.gov.jfrj.siga.dp.DpCargo;
import br.gov.jfrj.siga.dp.DpFuncaoConfianca;
import br.gov.jfrj.siga.dp.DpLotacao;
import br.gov.jfrj.siga.dp.DpPessoa;
import br.gov.jfrj.siga.dp.DpSubstituicao;
import br.gov.jfrj.siga.model.Selecionavel;
import br.gov.jfrj.siga.model.dao.DaoFiltro;
import br.gov.jfrj.siga.model.dao.HibernateUtil;
import br.gov.jfrj.siga.model.dao.ModeloDao;

public class CpDao extends ModeloDao {

    public static final String CACHE_QUERY_SUBSTITUICAO = "query.substituicao";
    public static final String CACHE_QUERY_CONFIGURACAO = "query.configuracao";
    public static final String CACHE_CORPORATIVO = "corporativo";
    public static final String CACHE_QUERY_SECONDS = "query.seconds";
    public static final String CACHE_QUERY_HOURS = "query.hours";
    public static final String CACHE_SECONDS = "seconds";

    public static CpDao getInstance(Session sessao, StatelessSession sessaoStateless) {
        return ModeloDao.getInstance(CpDao.class, sessao, sessaoStateless);
    }

    public static CpDao getInstance(Session sessao) {
        return ModeloDao.getInstance(CpDao.class, sessao);
    }

    public static CpDao getInstance() {
        return ModeloDao.getInstance(CpDao.class);
    }

    @SuppressWarnings("unchecked")
    public List<CpOrgao> consultarPorFiltro(final CpOrgaoDaoFiltro o) {
        return consultarPorFiltro(o, 0, 0);
    }

    @SuppressWarnings("unchecked")
    public List<CpOrgao> consultarPorFiltro(final CpOrgaoDaoFiltro o, final int offset, final int itemPagina) {
        try {
            final Query query = getSessao().getNamedQuery("consultarPorFiltroCpOrgao");
            if (offset > 0) {
                query.setFirstResult(offset);
            }
            if (itemPagina > 0) {
                query.setMaxResults(itemPagina);
            }
            String s = o.getNome();
            if (s != null)
                s = s.replace(' ', '%');
            query.setString("nome", s);

            final List<CpOrgao> l = query.list();
            return l;
        } catch (final NullPointerException e) {
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    public List<CpOrgao> consultarCpOrgaoOrdenadoPorNome() {
        try {
            final Query query = getSessao().getNamedQuery("consultarCpOrgaoOrdenadoPorNome");
            final List<CpOrgao> l = query.list();
            return l;
        } catch (final NullPointerException e) {
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    public List<CpFeriado> listarCpFeriadoPorDescricao() {
        try {
            final Query query = getSessao().getNamedQuery("listarCpFeriadoOrdenadoPorDescricao");
            final List<CpFeriado> l = query.list();
            return l;
        } catch (final NullPointerException e) {
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    public CpOrgao consultarPorSigla(final CpOrgao o) {
        final Query query = getSessao().getNamedQuery("consultarPorSiglaCpOrgao");
        query.setString("siglaOrgao", o.getSiglaOrgao());

        final List<CpOrgao> l = query.list();
        if (l.size() != 1)
            return null;
        return l.get(0);
    }

    @SuppressWarnings("unchecked")
    public CpServico consultarPorSigla(final CpServico o) {
        final Query query = getSessao().getNamedQuery("consultarPorSiglaCpServico");
        query.setString("siglaServico", o.getSiglaServico());
        query.setLong("idServicoPai", o.getCpServicoPai() == null ? 0 : o.getCpServicoPai().getIdServico());

        // Renato: Comentei a linha abaixo pois  nao entendi porque foi feito
        // dessa forma.
        // query.setFlushMode(FlushMode.MANUAL);

        query.setCacheable(true);
        query.setCacheRegion(CACHE_QUERY_HOURS);

        final List<CpServico> l = query.list();
        if (l.size() != 1)
            return null;
        return l.get(0);
    }

    @SuppressWarnings("unchecked")
    public CpServico consultarCpServicoPorChave(String chave) {
        // Cria uma cache region especifica da classe para garantir que os
        // objetos armazenados por uma aplicacacao seja recuperados por outra.
        // Isso causa ClassCastException.
        final String cRegion = CACHE_CORPORATIVO + "_" + this.getClass().getSimpleName();
        Cache cache = CacheManager.getInstance().getCache(cRegion);
        if (cache == null) {
            CacheManager manager = CacheManager.getInstance();
            manager.addCache(cRegion);
            cache = manager.getCache(cRegion);
            CacheConfiguration config;
            config = cache.getCacheConfiguration();
            config.setEternal(true);
            config.setMaxElementsInMemory(10000);
            config.setOverflowToDisk(false);
            config.setMaxElementsOnDisk(0);
        }
        Element element;
        if ((element = cache.get(chave)) != null) {
            return (CpServico) element.getValue();
        }

        StringBuilder sb = new StringBuilder(50);
        boolean supress = false;
        for (int i = 0; i < chave.length(); i++) {
            final char ch = chave.charAt(i);
            if (ch == ';') {
                sb.append('-');
                supress = false;
                continue;
            }
            if (ch == ':') {
                supress = true;
                continue;
            }
            if (!supress)
                sb.append(ch);
        }
        String sigla = sb.toString();

        final Query query = getSessao().getNamedQuery("consultarPorSiglaStringCpServico");
        query.setString("siglaServico", sigla);

        query.setCacheable(true);
        query.setCacheRegion(CACHE_QUERY_HOURS);

        final List<CpServico> l = query.list();
        if (l.size() != 1)
            return null;

        // Forca a carga de algums campos para garantir o lazy load.
        CpServico srv = (CpServico) l.get(0).getImplementation();
        Object o1 = srv.getCpServicoPai().getDescricao();
        Object o2 = srv.getCpTipoServico().getDscTpServico();

        cache.put(new Element(chave, srv));
        return l.get(0);
    }

    public Selecionavel consultarPorSigla(final CpOrgaoDaoFiltro flt) {
        final CpOrgao o = new CpOrgao();
        o.setSigla(flt.getSigla());
        return consultarPorSigla(o);
    }

    // public int consultarQuantidade(final DaoFiltro o) {
    // if (o instanceof CpOrgaoDaoFiltro)
    // return consultarQuantidade((CpOrgaoDaoFiltro) o);
    // if (o instanceof CpOrgaoUsuarioDaoFiltro)
    // return consultarQuantidade((CpOrgaoUsuarioDaoFiltro) o);
    // if (o instanceof DpCargoDaoFiltro)
    // return consultarQuantidade((DpCargoDaoFiltro) o);
    // if (o instanceof DpFuncaoConfiancaDaoFiltro)
    // return consultarQuantidade((DpFuncaoConfiancaDaoFiltro) o);
    // if (o instanceof DpLotacaoDaoFiltro)
    // return consultarQuantidade((DpLotacaoDaoFiltro) o);
    // if (o instanceof DpPessoaDaoFiltro)
    // return consultarQuantidade((DpPessoaDaoFiltro) o);
    // return 0;
    // }

    public int consultarQuantidade(final DaoFiltro o) throws Exception, SecurityException, IllegalAccessException,
            InvocationTargetException, NoSuchMethodException {
        Class[] argType = { o.getClass() };
        return (Integer) this.getClass().getMethod("consultarQuantidade", argType).invoke(this, o);
    }

    public Selecionavel consultarPorSigla(final DaoFiltro o) throws Exception, SecurityException,
            IllegalAccessException, InvocationTargetException, NoSuchMethodException {
        Class[] argType = { o.getClass() };
        return (Selecionavel) this.getClass().getMethod("consultarPorSigla", argType).invoke(this, o);
    }

    public int consultarQuantidade(final CpOrgaoDaoFiltro o) {
        try {
            final Query query = getSessao().getNamedQuery("consultarQuantidadeCpOrgao");
            String s = o.getNome();
            if (s != null)
                s = s.replace(' ', '%');
            query.setString("nome", s);

            final int l = ((Long) query.uniqueResult()).intValue();
            return l;
        } catch (final NullPointerException e) {
            return 0;
        }
    }

    public List consultarPorFiltro(final DaoFiltro o) throws Exception {
        return consultarPorFiltro(o, 0, 0);
    }

    public List consultarPorFiltro(final DaoFiltro o, final int offset, final int itemPagina) throws Exception {
        Class[] argType = { o.getClass(), Integer.TYPE, Integer.TYPE };
        return (List) this.getClass().getMethod("consultarPorFiltro", argType).invoke(this, o, offset, itemPagina);
    }

    @SuppressWarnings("unchecked")
    public List<CpOrgaoUsuario> consultarPorFiltro(final CpOrgaoUsuarioDaoFiltro o) {
        return consultarPorFiltro(o, 0, 0);
    }

    @SuppressWarnings("unchecked")
    public List<CpOrgaoUsuario> consultarPorFiltro(final CpOrgaoUsuarioDaoFiltro o, final int offset,
            final int itemPagina) {
        try {
            final Query query = getSessao().getNamedQuery("consultarPorFiltroCpOrgao");
            if (offset > 0) {
                query.setFirstResult(offset);
            }
            if (itemPagina > 0) {
                query.setMaxResults(itemPagina);
            }
            String s = o.getNome();
            if (s != null)
                s = s.replace(' ', '%');
            query.setString("nome", s);

            query.setCacheable(true);
            query.setCacheRegion(CACHE_QUERY_HOURS);

            final List<CpOrgaoUsuario> l = query.list();
            return l;
        } catch (final NullPointerException e) {
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    public CpOrgaoUsuario consultarPorSigla(final CpOrgaoUsuario o) {
        final Query query = getSessao().getNamedQuery("consultarSiglaOrgaoUsuario");
        query.setString("sigla", o.getSiglaOrgaoUsu());

        query.setCacheable(true);
        query.setCacheRegion(CACHE_QUERY_HOURS);

        final List<CpOrgaoUsuario> l = query.list();
        if (l.size() != 1)
            return null;
        return l.get(0);
    }

    public Selecionavel consultarPorSigla(final CpOrgaoUsuarioDaoFiltro flt) {
        final CpOrgaoUsuario o = new CpOrgaoUsuario();
        o.setSigla(flt.getSigla());
        return consultarPorSigla(o);
    }

    public int consultarQuantidade(final CpOrgaoUsuarioDaoFiltro o) {
        try {
            final Query query = getSessao().getNamedQuery("consultarQuantidadeCpOrgao");
            String s = o.getNome();
            if (s != null)
                s = s.replace(' ', '%');
            query.setString("nome", s);

            query.setCacheable(true);
            query.setCacheRegion(CACHE_QUERY_HOURS);

            final int l = ((Long) query.uniqueResult()).intValue();
            return l;
        } catch (final NullPointerException e) {
            return 0;
        }
    }

    @SuppressWarnings("unchecked")
    public List<DpCargo> consultarPorFiltro(final DpCargoDaoFiltro o) {
        return consultarPorFiltro(o, 0, 0);
    }

    @SuppressWarnings("unchecked")
    public List<DpCargo> consultarPorFiltro(final DpCargoDaoFiltro o, final int offset, final int itemPagina) {
        try {
            final Query query = getSessao().getNamedQuery("consultarPorFiltroDpCargo");
            if (offset > 0) {
                query.setFirstResult(offset);
            }
            if (itemPagina > 0) {
                query.setMaxResults(itemPagina);
            }
            String s = o.getNome();
            if (s != null)
                s = s.replace(' ', '%');
            query.setString("nome", s);

            if (o.getIdOrgaoUsu() != null)
                query.setLong("idOrgaoUsu", o.getIdOrgaoUsu());
            else
                query.setLong("idOrgaoUsu", 0);

            final List<DpCargo> l = query.list();
            return l;
        } catch (final NullPointerException e) {
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    public DpCargo consultarPorSigla(final DpCargo o) {
        final Query query = getSessao().getNamedQuery("consultarPorSiglaDpCargo");
        query.setString("siglaCargo", o.getSiglaCargo());

        final List<DpCargo> l = query.list();
        if (l.size() != 1)
            return null;
        return l.get(0);
    }

    public Selecionavel consultarPorSigla(final DpCargoDaoFiltro flt) {
        final DpCargo o = new DpCargo();
        o.setSigla(flt.getSigla());
        o.setIdCargoIni(flt.getIdCargoIni());
        return consultarPorSigla(o);
    }

    public int consultarQuantidade(final DpCargoDaoFiltro o) {
        try {
            final Query query = getSessao().getNamedQuery("consultarQuantidadeDpCargo");
            String s = o.getNome();
            if (s != null)
                s = s.replace(' ', '%');
            query.setString("nome", s);

            if (o.getIdOrgaoUsu() != null)
                query.setLong("idOrgaoUsu", o.getIdOrgaoUsu());
            else
                query.setLong("idOrgaoUsu", 0);

            final int l = ((Long) query.uniqueResult()).intValue();
            return l;
        } catch (final NullPointerException e) {
            return 0;
        }
    }

    @SuppressWarnings("unchecked")
    public List<DpFuncaoConfianca> consultarPorFiltro(final DpFuncaoConfiancaDaoFiltro o) {
        return consultarPorFiltro(o, 0, 0);
    }

    @SuppressWarnings("unchecked")
    public List<DpFuncaoConfianca> consultarPorFiltro(final DpFuncaoConfiancaDaoFiltro o, final int offset,
            final int itemPagina) {
        try {
            final Query query = getSessao().getNamedQuery("consultarPorFiltroDpFuncaoConfianca");
            if (offset > 0) {
                query.setFirstResult(offset);
            }
            if (itemPagina > 0) {
                query.setMaxResults(itemPagina);
            }
            String s = o.getNome();
            if (s != null)
                s = s.replace(' ', '%');
            query.setString("nome", s);

            if (o.getIdOrgaoUsu() != null)
                query.setLong("idOrgaoUsu", o.getIdOrgaoUsu());
            else
                query.setLong("idOrgaoUsu", 0);

            final List<DpFuncaoConfianca> l = query.list();
            return l;
        } catch (final NullPointerException e) {
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    public List<CpAplicacaoFeriado> listarAplicacoesFeriado(final CpAplicacaoFeriado apl) {
        final Query query = getSessao().getNamedQuery("listarAplicacoesFeriado");
        query.setLong("cpOcorrenciaFeriado", apl.getCpOcorrenciaFeriado().getId());

        query.setCacheable(true);
        query.setCacheRegion(CACHE_QUERY_HOURS);

        final List<CpAplicacaoFeriado> l = query.list();
        return l;
    }

    @SuppressWarnings("unchecked")
    public DpFuncaoConfianca consultarPorSigla(final DpFuncaoConfianca o) {
        final Query query = getSessao().getNamedQuery("consultarPorSiglaDpFuncaoConfianca");
        query.setLong("idFuncao", o.getIdFuncao());
        if (o.getOrgaoUsuario() != null)
            query.setLong("idOrgaoUsu", o.getOrgaoUsuario().getIdOrgaoUsu());
        else
            query.setLong("idOrgaoUsu", 0);

        final List<DpFuncaoConfianca> l = query.list();
        if (l.size() != 1)
            return null;
        return l.get(0);
    }

    public Selecionavel consultarPorSigla(final DpFuncaoConfiancaDaoFiltro flt) {
        final DpFuncaoConfianca o = new DpFuncaoConfianca();
        o.setSigla(flt.getSigla());
        CpOrgaoUsuario cpOrgao = new CpOrgaoUsuario();
        cpOrgao.setIdOrgaoUsu(flt.getIdOrgaoUsu());
        o.setOrgaoUsuario(cpOrgao);
        return consultarPorSigla(o);
    }

    public int consultarQuantidade(final DpFuncaoConfiancaDaoFiltro o) {
        try {
            final Query query = getSessao().getNamedQuery("consultarQuantidadeDpFuncaoConfianca");
            String s = o.getNome();
            if (s != null)
                s = s.replace(' ', '%');
            query.setString("nome", s);
            if (o.getIdOrgaoUsu() != null)
                query.setLong("idOrgaoUsu", o.getIdOrgaoUsu());
            else
                query.setLong("idOrgaoUsu", 0);

            final int l = ((Long) query.uniqueResult()).intValue();
            return l;
        } catch (final NullPointerException e) {
            return 0;
        }
    }

    public List<DpPessoa> consultarPessoasComFuncaoConfianca(Long idFuncao) {
        final Query query = getSessao().getNamedQuery("consultarPessoasComFuncaoConfianca");
        query.setLong("idFuncaoConfianca", idFuncao);
        return query.list();
    }

    @SuppressWarnings("unchecked")
    public List<DpPessoa> consultarPessoasComCargo(Long idCargo) {
        final Query query = getSessao().getNamedQuery("consultarPessoasComCargo");
        query.setLong("idCargo", idCargo);
        return query.list();
    }

    public List<DpLotacao> consultarPorFiltro(final DpLotacaoDaoFiltro o) {
        return consultarPorFiltro(o, 0, 0);
    }

    @SuppressWarnings("unchecked")
    public List<DpLotacao> consultarPorFiltro(final DpLotacaoDaoFiltro o, final int offset, final int itemPagina) {
        try {
            final Query query;

            if (!o.isBuscarFechadas())
                query = getSessao().getNamedQuery("consultarPorFiltroDpLotacao");
            else
                query = getSessao().getNamedQuery("consultarPorFiltroDpLotacaoInclusiveFechadas");
            if (offset > 0) {
                query.setFirstResult(offset);
            }
            if (itemPagina > 0) {
                query.setMaxResults(itemPagina);
            }
            query.setString("nome", o.getNome() == null ? "" : o.getNome().replace(' ', '%'));

            if (o.getIdOrgaoUsu() != null)
                query.setLong("idOrgaoUsu", o.getIdOrgaoUsu());
            else
                query.setLong("idOrgaoUsu", 0);

            query.setCacheable(true);
            query.setCacheRegion(CACHE_QUERY_CONFIGURACAO);
            final List<DpLotacao> l = query.list();
            return l;
        } catch (final NullPointerException e) {
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    public DpLotacao consultarPorSigla(final DpLotacao o) {
        final Query query = getSessao().getNamedQuery("consultarPorSiglaDpLotacao");
        query.setString("siglaLotacao", o.getSigla());
        if (o.getOrgaoUsuario() != null)
            if (o.getOrgaoUsuario().getIdOrgaoUsu() != null)
                query.setLong("idOrgaoUsu", o.getOrgaoUsuario().getIdOrgaoUsu());
            else
                query.setLong("idOrgaoUsu", consultarPorSigla(o.getOrgaoUsuario()).getId());
        else
            query.setLong("idOrgaoUsu", 0);

        query.setCacheable(true);
        query.setCacheRegion(CACHE_QUERY_CONFIGURACAO);
        final List<DpLotacao> l = query.list();
        if (l.size() != 1)
            return null;
        return l.get(0);
    }

    @SuppressWarnings("unchecked")
    public DpLotacao consultarPorIdInicial(Class<DpLotacao> clazz, final Long idInicial) {
        final Query query = getSessao().getNamedQuery("consultarPorIdInicialDpLotacao");
        query.setLong("idLotacaoIni", idInicial);

        query.setCacheable(true);
        query.setCacheRegion(CACHE_QUERY_CONFIGURACAO);
        final List<DpLotacao> l = query.list();
        if (l.size() != 1)
            return null;
        return l.get(0);
    }

    @SuppressWarnings("unchecked")
    public DpLotacao consultarPorIdInicialInclusiveLotacaoFechada(Class<DpLotacao> clazz, final Long idInicial) {
        final Query query = getSessao().getNamedQuery("consultarPorIdInicialDpLotacaoInclusiveFechada");
        query.setLong("idLotacaoIni", idInicial);

        query.setCacheable(true);
        query.setCacheRegion(CACHE_QUERY_CONFIGURACAO);
        final List<DpLotacao> l = query.list();
        if (l.size() != 1)
            return null;
        return l.get(0);
    }

    public Selecionavel consultarPorSigla(final DpLotacaoDaoFiltro flt) {
        final DpLotacao o = new DpLotacao();
        o.setSigla(flt.getSigla());
        if (o.getOrgaoUsuario() == null && flt.getIdOrgaoUsu() != null) {
            CpOrgaoUsuario cpOrgaoUsu = consultar(flt.getIdOrgaoUsu(), CpOrgaoUsuario.class, false);
            o.setOrgaoUsuario(cpOrgaoUsu);
        }

        /*      CpOrgaoUsuario cpOrgao = new CpOrgaoUsuario();
        cpOrgao.setIdOrgaoUsu(flt.getIdOrgaoUsu());
        o.setOrgaoUsuario(cpOrgao);*/
        return consultarPorSigla(o);
    }

    public int consultarQuantidade(final DpLotacaoDaoFiltro o) {
        try {
            final Query query;

            if (!o.isBuscarFechadas())
                query = getSessao().getNamedQuery("consultarQuantidadeDpLotacao");
            else
                query = getSessao().getNamedQuery("consultarQuantidadeDpLotacaoInclusiveFechadas");

            query.setString("nome", o.getNome().replace(' ', '%'));

            if (o.getIdOrgaoUsu() != null)
                query.setLong("idOrgaoUsu", o.getIdOrgaoUsu());
            else
                query.setLong("idOrgaoUsu", 0);

            query.setCacheable(true);
            query.setCacheRegion(CACHE_QUERY_CONFIGURACAO);
            final int l = ((Long) query.uniqueResult()).intValue();
            return l;
        } catch (final NullPointerException e) {
            return 0;
        }
    }

    public Selecionavel consultarPorSigla(final CpGrupoDaoFiltro flt) throws AplicacaoException {
        final CpGrupo o = CpGrupo.getInstance(flt.getIdTpGrupo());
        o.setSigla(flt.getSigla());
        return consultarPorSigla(o);
    }

    @SuppressWarnings("unchecked")
    public CpGrupo consultarPorSigla(final CpGrupo o) {
        final Query query = getSessao().getNamedQuery("consultarPorSiglaCpGrupo");
        query.setString("siglaGrupo", o.getSigla());
        if (o.getOrgaoUsuario() != null)
            query.setLong("idOrgaoUsu", o.getOrgaoUsuario().getIdOrgaoUsu());
        else
            query.setLong("idOrgaoUsu", 0);
        query.setCacheable(true);
        query.setCacheRegion(CACHE_QUERY_HOURS);
        final List<CpGrupo> l = query.list();
        if (l.size() != 1)
            return null;
        return l.get(0);
    }

    @SuppressWarnings("unchecked")
    public CpPerfil consultarPorSigla(final CpPerfil o) {
        final Query query = getSessao().getNamedQuery("consultarPorSiglaCpGrupo");
        query.setString("siglaGrupo", o.getSigla());
        if (o.getOrgaoUsuario() != null)
            query.setLong("idOrgaoUsu", o.getOrgaoUsuario().getIdOrgaoUsu());
        else
            query.setLong("idOrgaoUsu", 0);
        query.setCacheable(true);
        query.setCacheRegion(CACHE_QUERY_HOURS);
        final List<CpPerfil> l = query.list();
        if (l.size() != 1)
            return null;
        return l.get(0);
    }

    public int consultarQuantidade(final CpGrupoDaoFiltro o) {
        try {
            final Query query;
            if (o.getNome() != null) {
                query = getSessao().getNamedQuery("consultarQuantidadeCpGrupoPorCpTipoGrupoIdENome");
                query.setString("siglaGrupo", o.getNome());
            } else {
                query = getSessao().getNamedQuery("consultarQuantidadeCpGrupoPorCpTipoGrupoId");
            }

            if (o.getIdTpGrupo() != null) {
                query.setLong("idTpGrupo", o.getIdTpGrupo());
            } else {
                query.setLong("idTpGrupo", 0);
            }
            final int l = ((Long) query.uniqueResult()).intValue();
            return l;
        } catch (final NullPointerException e) {
            return 0;
        }
    }

    @SuppressWarnings("unchecked")
    public List<CpGrupo> consultarPorFiltro(final CpGrupoDaoFiltro o, final int offset, final int itemPagina) {
        try {
            final Query query;
            if (o.getNome() != null) {
                query = getSessao().getNamedQuery("consultarCpGrupoPorCpTipoGrupoIdENome");
                query.setString("siglaGrupo", o.getNome());
            } else {
                query = getSessao().getNamedQuery("consultarCpGrupoPorCpTipoGrupoId");
            }
            if (offset > 0) {
                query.setFirstResult(offset);
            }
            if (itemPagina > 0) {
                query.setMaxResults(itemPagina);
            }
            if (o.getIdTpGrupo() != null) {
                query.setLong("idTpGrupo", o.getIdTpGrupo());
            } else {
                query.setLong("idTpGrupo", 0);
            }
            final List<CpGrupo> l = query.list();
            return l;
        } catch (final NullPointerException e) {
            return null;
        }
    }

    public DpPessoa consultarPorCpf(final long cpf) {

        final Query qry = getSessao().getNamedQuery("consultarPorCpf");
        qry.setLong("cpfPessoa", cpf);
        final DpPessoa pes = (DpPessoa) qry.uniqueResult();
        return pes;
    }

    public DpPessoa consultarPorEmail(final String email) {

        final Query qry = getSessao().getNamedQuery("consultarPorEmail");
        qry.setString("emailPessoa", email);
        final DpPessoa pes = (DpPessoa) qry.uniqueResult();
        return pes;
    }

    @SuppressWarnings("unchecked")
    public DpPessoa consultarPorSigla(final DpPessoa o) {
        try {
            final Query query = getSessao().getNamedQuery("consultarPorSiglaDpPessoa");
            query.setString("sesb", o.getSesbPessoa());
            query.setLong("matricula", o.getMatricula());
            /*
             * if (o.getOrgaoUsuario().getIdOrgaoUsu() != null)
             * query.setLong("idOrgaoUsu", o.getOrgaoUsuario().getIdOrgaoUsu());
             * else query.setLong("idOrgaoUsu", 0);
             */

            final List<DpPessoa> l = query.list();
            if (l.size() != 1)
                return null;
            return l.get(0);
        } catch (final NullPointerException e) {
            return null;
        }
    }

    /**
     * retorna a pessoa pelo sesb+matricula
     * 
     * @param principal
     * @return
     */
    public DpPessoa getPessoaPorPrincipal(String principal) {
        DpPessoa pessoaTemplate = new DpPessoa();
        pessoaTemplate.setSesbPessoa(principal.substring(0, 2));
        pessoaTemplate.setMatricula(Long.parseLong(principal.substring(2)));
        DpPessoa pessoaNova = CpDao.getInstance().consultarPorSigla(pessoaTemplate);
        return pessoaNova;
    }

    @SuppressWarnings("unchecked")
    public DpPessoa consultarPorIdInicial(final Long idInicial) {
        try {
            final Query query = getSessao().getNamedQuery("consultarPorIdInicialDpPessoa");
            query.setLong("idPessoaIni", idInicial);

            query.setCacheable(true);
            query.setCacheRegion(CACHE_QUERY_HOURS);

            final List<DpPessoa> l = query.list();
            if (l.size() != 1)
                return null;
            return l.get(0);
        } catch (final NullPointerException e) {
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    public List<DpPessoa> consultarPorIdInicialInclusiveFechadas(final Long idInicial) {
        try {
            final Query query = getSessao().getNamedQuery("consultarPorIdInicialDpPessoaInclusiveFechadas");
            query.setLong("idPessoaIni", idInicial);

            return query.list();
        } catch (final NullPointerException e) {
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    public DpPessoa consultarPorIdInicialInclusiveLotacaoFechada(final Long idInicial) {
        try {
            final Query query = getSessao().getNamedQuery("consultarPorIdInicialDpLotacaoInclusiveFechada");
            query.setLong("idPessoaIni", idInicial);

            final List<DpPessoa> l = query.list();
            if (l.size() != 1)
                return null;
            return l.get(0);
        } catch (final NullPointerException e) {
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    public List<CpUF> consultarUF() {

        Query query = getSessao().createQuery("from CpUF l order by l.nmUF");
        List l = query.list();
        return l;
    }

    @SuppressWarnings("unchecked")
    public List<CpLocalidade> consultarLocalidadesPorUF(final CpUF cpuf) {

        Query query = getSessao().createQuery("from CpLocalidade l where l.UF.idUF = " + cpuf.getIdUF().intValue());
        List l = query.list();
        return l;
    }

    @SuppressWarnings("unchecked")
    public List<CpLocalidade> consultarLocalidadesPorUF(final String siglaUF) {

        Query query = getSessao().createQuery("from CpLocalidade l where l.UF.nmUF = :siglaUF");
        query.setString("siglaUF", siglaUF);
        List l = query.list();
        return l;
    }

    @SuppressWarnings("unchecked")
    public List<CpLocalidade> consultarLocalidades() {

        Query query = getSessao().createQuery("from CpLocalidade l order by l.nmLocalidade");
        List l = query.list();
        return l;
    }

    @SuppressWarnings("unchecked")
    public CpPersonalizacao consultarPersonalizacao(DpPessoa pes) {
        final Query query = getSessao().getNamedQuery("consultarPersonalizacao");
        query.setLong("idPessoaIni", pes.getIdPessoaIni());

        // query.setCacheable(true);
        // query.setCacheRegion("query.CpPersonalizacao");
        final List<CpPersonalizacao> l = query.list();
        if (l.size() != 1)
            return null;
        return l.get(0);
    }

    public List<DpPessoa> consultarPorFiltro(final DpPessoaDaoFiltro flt) {
        return consultarPorFiltro(flt, 0, 0);
    }

    @SuppressWarnings("unchecked")
    public List<DpPessoa> consultarAtivasNaDataOrgao(final Date dt, final CpOrgaoUsuario org) {
        final Query query;
        query = getSessao().getNamedQuery("consultarAtivasNaDataOrgao");
        query.setLong("idOrgaoUsu", org.getIdOrgaoUsu());
        query.setDate("dt", dt);
        return query.list();
    }

    @SuppressWarnings("unchecked")
    public List<DpPessoa> consultarPorFiltro(final DpPessoaDaoFiltro flt, final int offset, final int itemPagina) {
        try {
            final Query query;

            if (!flt.isBuscarFechadas())
                query = getSessao().getNamedQuery("consultarPorFiltroDpPessoa");
            else
                query = getSessao().getNamedQuery("consultarPorFiltroDpPessoaInclusiveFechadas");

            if (offset > 0) {
                query.setFirstResult(offset);
            }
            if (itemPagina > 0) {
                query.setMaxResults(itemPagina);
            }
            query.setString("nome", flt.getNome().toUpperCase().replace(' ', '%'));

            if (!flt.isBuscarFechadas())
                query.setString("situacaoFuncionalPessoa", flt.getSituacaoFuncionalPessoa());

            if (flt.getIdOrgaoUsu() != null)
                query.setLong("idOrgaoUsu", flt.getIdOrgaoUsu());
            else
                query.setLong("idOrgaoUsu", 0);

            if (flt.getLotacao() != null)
                query.setLong("lotacao", flt.getLotacao().getId());
            else
                query.setLong("lotacao", 0);

            final List<DpPessoa> l = query.list();
            return l;
        } catch (final NullPointerException e) {
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    public List<DpPessoa> consultarPorOrgaoUsuDpPessoaInclusiveFechadas(final long idOrgaoUsu) {
        try {
            final Query query = getSessao().getNamedQuery("consultarPorOrgaoUsuDpPessoaInclusiveFechadas");

            query.setLong("idOrgaoUsu", idOrgaoUsu);

            final List<DpPessoa> l = query.list();
            return l;
        } catch (final NullPointerException e) {
            return null;
        }
    }

    public int consultarQuantidade(final DpPessoaDaoFiltro flt) {
        try {
            final Query query;

            if (!flt.isBuscarFechadas())
                query = getSessao().getNamedQuery("consultarQuantidadeDpPessoa");
            else
                query = getSessao().getNamedQuery("consultarQuantidadeDpPessoaInclusiveFechadas");

            query.setString("nome", flt.getNome().toUpperCase().replace(' ', '%'));

            if (!flt.isBuscarFechadas())
                query.setString("situacaoFuncionalPessoa", flt.getSituacaoFuncionalPessoa());

            if (flt.getIdOrgaoUsu() != null)
                query.setLong("idOrgaoUsu", flt.getIdOrgaoUsu());
            else
                query.setLong("idOrgaoUsu", 0);
            if (flt.getLotacao() != null)
                query.setLong("lotacao", flt.getLotacao().getId());
            else
                query.setLong("lotacao", 0);

            final int l = ((Long) query.uniqueResult()).intValue();
            return l;
        } catch (final NullPointerException e) {
            return 0;
        }
    }

    public Selecionavel consultarPorSigla(final DpPessoaDaoFiltro flt) {
        final DpPessoa o = new DpPessoa();
        o.setSigla(flt.getSigla());
        /*
         * CpOrgaoUsuario cpOrgao = new CpOrgaoUsuario();
         * cpOrgao.setIdOrgaoUsu(flt.getIdOrgaoUsu());
         * o.setOrgaoUsuario(cpOrgao);
         */
        return consultarPorSigla(o);
    }

    @SuppressWarnings("unchecked")
    public List<DpSubstituicao> consultarSubstituicoesPermitidas(final DpSubstituicao exemplo) throws SQLException {
        try {
            Query query = null;
            query = getSessao().getNamedQuery("consultarSubstituicoesPermitidas");
            query.setLong("idSubstitutoIni", exemplo.getSubstituto().getIdPessoaIni());
            query.setLong("idLotaSubstitutoIni", exemplo.getLotaSubstituto().getIdLotacaoIni());
            // query.setCacheable(true);
            // query.setCacheRegion(CACHE_QUERY_SUBSTITUICAO);
            return query.list();
        } catch (final IllegalArgumentException e) {
            throw e;
        } catch (final Exception e) {
            return null;
        }
    }

    @SuppressWarnings("unchecked")
    public List<DpSubstituicao> consultarOrdemData(final DpSubstituicao exemplo) throws SQLException {
        try {
            Query query = null;
            query = getSessao().getNamedQuery("consultarOrdemData");
            query.setLong("idTitularIni", exemplo.getTitular().getIdPessoaIni());
            query.setLong("idLotaTitularIni", exemplo.getLotaTitular().getIdLotacaoIni());
            // query.setCacheable(true);
            // query.setCacheRegion(CACHE_QUERY_SUBSTITUICAO);
            return query.list();
        } catch (final IllegalArgumentException e) {
            throw e;
        } catch (final Exception e) {
            return null;
        }
    }

    public CpIdentidade consultaIdentidadeCadastrante(final String nmUsuario, boolean fAtiva)
            throws AplicacaoException {
        List<CpIdentidade> lista = consultaIdentidadesCadastrante(nmUsuario, fAtiva);
        // obtem preferencialmente identidade de formulario - unico formato que
        // existia anteriormente
        for (CpIdentidade idLista : lista) {
            if (idLista.getCpTipoIdentidade().isTipoFormulario()) {
                return idLista;
            }
        }
        // se nao encontrar, retorna o primeiro, como era antes.
        final CpIdentidade id = lista.get(0);
        return id;
    }

    @SuppressWarnings("unchecked")
    public List<CpIdentidade> consultaIdentidadesCadastrante(final String nmUsuario, boolean fAtiva)
            throws AplicacaoException {
        try {
            final Query qry = getSessao().getNamedQuery(
                    fAtiva ? "consultarIdentidadeCadastranteAtiva" : "consultarIdentidadeCadastrante");
            qry.setString("nmUsuario", nmUsuario);
            // Verifica se existe numeros no login do usuario
            if (nmUsuario.substring(2).matches("^[0-9]*$"))
                qry.setString("sesbPessoa", nmUsuario.substring(0, 2));
            else
                qry.setString("sesbPessoa", "RJ"); // se nnao ha numeros atribui
            // RJ
            // por default

            // Cache was disabled because it would interfere with the
            // "change password" action.
            qry.setCacheable(true);
            qry.setCacheRegion(CACHE_QUERY_SECONDS);
            final List<CpIdentidade> lista = (List<CpIdentidade>) qry.list();
            if (lista.size() == 0) {
                throw new AplicacaoException(
                        "Nao foi possivel localizar a identidade do usuario '" + nmUsuario + "'.");
            }
            return lista;
        } catch (Throwable e) {
            throw new AplicacaoException(
                    "Ocorreu um erro tentando localizar a identidade do usuario '" + nmUsuario + "'.", 0, e);
        }
    }

    @SuppressWarnings("unchecked")
    public List<CpIdentidade> consultaIdentidades(final DpPessoa pessoa) {
        final Query qry = getSessao().getNamedQuery("consultarIdentidades");
        qry.setLong("idPessoaIni", pessoa.getIdInicial());
        qry.setCacheable(false);
        final List<CpIdentidade> lista = qry.list();
        return lista;
    }

    /*
     * @SuppressWarnings("unchecked") public Usuario
     * consultaUsuarioCadastrante(final String nmUsuario) { try { final Query
     * qry = getSessao().getNamedQuery( "consultarUsuarioCadastrante");
     * qry.setString("nmUsuario", nmUsuario); // Verifica se existe numeros no
     * login do usuario if (nmUsuario.substring(2).matches("^[0-9]*$"))
     * qry.setString("sesbPessoa", nmUsuario.substring(0, 2)); else
     * qry.setString("sesbPessoa", "RJ"); // se nnao ha numeros atribui // RJ //
     * por default
     * 
     * qry.setCacheable(true); qry.setCacheRegion("query.UsuarioCadastrante");
     * final List<Object[]> lista = qry.list(); if (lista.size() == 0) { throw
     * new AplicacaoException( "Nao foi possivel localizar o usuario '" +
     * nmUsuario + "'."); } final Object[] par = lista.get(0); final Usuario usu
     * = (Usuario) par[0]; final DpPessoa pess = (DpPessoa) par[1];
     * usu.setPessoa(pess); return usu; } catch (Throwable e) { Auto-generated
     * catch block e.printStackTrace(); return null; } }
     * 
     * public Usuario consultaUsuarioCadastranteAtivo(final String nmUsuario)
     * throws Exception { // Nato: comentei porque estava muito dificil de
     * debugar erros de banco // de dados quando as excecoes nao sao lancadas
     * aqui. // try { final Query qry = getSessao().getNamedQuery(
     * "consultarUsuarioCadastranteAtivo"); qry.setString("nmUsuario",
     * nmUsuario); // Verifica se existe numeros no login do usuario if
     * (nmUsuario.substring(2).matches("^[0-9]*$")) qry.setString("sesbPessoa",
     * nmUsuario.substring(0, 2)); else qry.setString("sesbPessoa", "RJ"); // se
     * nao ha numeros atribui // RJ // por default
     * 
     * qry.setCacheable(true);
     * qry.setCacheRegion("query.UsuarioCadastranteAtivo"); final List<Object[]>
     * lista = qry.list(); if (lista.size() == 0) { throw new
     * AplicacaoException( "Nao foi possivel localizar o usuario '" + nmUsuario
     * + "'."); } final Object[] par = lista.get(0); final Usuario usu =
     * (Usuario) par[0]; final DpPessoa pess = (DpPessoa) par[1];
     * usu.setPessoa(pess); return usu; // Nato: comentei porque estava muito
     * dificil de debugar erros de banco // de dados quando as excecoes nao sao
     * lancadas aqui. // } catch (Throwable e) { // block //
     * e.printStackTrace(); // return null; // } }
     */
    public List<DpPessoa> pessoasPorLotacao(Long id, Boolean incluirSublotacoes, Boolean somenteServidor,
            SituacaoFuncionalEnum situacoesFuncionais) throws AplicacaoException {
        if (id == null || id == 0)
            return null;

        DpLotacao lotacao = consultar(id, DpLotacao.class, false);

        List<DpLotacao> sublotacoes = new ArrayList<DpLotacao>();
        sublotacoes.add(lotacao);
        if (incluirSublotacoes) {
            List<DpLotacao> lotacoes = listarLotacoes();
            boolean continuar = true;
            while (continuar) {
                continuar = false;
                for (DpLotacao lot : lotacoes) {
                    if (sublotacoes.contains(lot))
                        continue;
                    if (sublotacoes.contains(lot.getLotacaoPai())) {
                        if (!lot.isSubsecretaria()) {
                            sublotacoes.add(lot);
                            continuar = true;
                        }
                    }
                }
            }
        }

        List<DpPessoa> lstCompleta = new ArrayList<DpPessoa>();
        for (DpLotacao lot : sublotacoes) {

            Criteria c = HibernateUtil.getSessao().createCriteria(DpPessoa.class);
            c.createAlias("cargo", "c");

            c.add(Restrictions.eq("lotacao.id", lot.getId()));
            if (somenteServidor) {
                c.add(Restrictions.not(Restrictions.in("c.nomeCargo",
                        new String[] { "ESTAGIARIO", "JUIZ SUBSTITUTO", "JUIZ FEDERAL" })));
            }

            c.add(Restrictions.in("situacaoFuncionalPessoa", situacoesFuncionais.getValor()));

            c.add(Restrictions.isNull("dataFimPessoa"));

            c.addOrder(Order.asc("nomePessoa"));

            lstCompleta.addAll((List<DpPessoa>) c.list());

        }
        return lstCompleta;
    }

    public List<DpPessoa> pessoasPorLotacao(Long id, Boolean incluirSublotacoes, Boolean somenteServidor) {
        return pessoasPorLotacao(id, incluirSublotacoes, somenteServidor, SituacaoFuncionalEnum.APENAS_ATIVOS);
    }

    public DpPessoa consultarPorCpfMatricula(final long cpf, long matricula) {

        final Query qry = getSessao().getNamedQuery("consultarPorCpfMatricula");
        qry.setLong("cpfPessoa", cpf);
        qry.setLong("matricula", matricula);
        final DpPessoa pes = (DpPessoa) qry.uniqueResult();
        return pes;
    }

    public Date consultarDataEHoraDoServidor() throws AplicacaoException {
        SQLQuery sql = (SQLQuery) getSessao().getNamedQuery("consultarDataEHoraDoServidor");

        List result = sql.list();
        if (result.size() != 1)
            throw new AplicacaoException("Nao foi possivel obter a data e a hora atuais do servidor.");

        return (Date) ((result.get(0)));
    }

    public List<CpConfiguracao> consultarConfiguracoesDesde(Date desde) {
        Criteria c = HibernateUtil.getSessao().createCriteria(CpConfiguracao.class);
        LogicalExpression confsAtivas = Restrictions.and(Restrictions.ge("hisDtIni", desde),
                Restrictions.isNull("hisDtFim"));
        LogicalExpression confsInativas = Restrictions.and(Restrictions.ge("hisDtFim", desde),
                Restrictions.isNotNull("hisDtFim"));
        c.add(Restrictions.or(confsAtivas, confsInativas));
        return c.list();
    }

    public Date consultarDataUltimaAtualizacao() throws AplicacaoException {
        //   Query sql = (Query) getSessao().getNamedQuery("consultarDataUltimaAtualizacao");
        Query sql = (Query) HibernateUtil.getSessionFactory().openStatelessSession()
                .getNamedQuery("consultarDataUltimaAtualizacao");

        sql.setCacheable(false);
        List result = sql.list();
        if (result.size() != 1)
            throw new AplicacaoException(
                    "Nao foi possivel obter a data e a hora de atualizacao das configuracoes.");

        Date dtIni = (Date) ((Object[]) (result.get(0)))[0];
        Date dtFim = (Date) ((Object[]) (result.get(0)))[1];
        return DateUtils.max(dtIni, dtFim);
    }

    public Date dt() throws AplicacaoException {
        return consultarDataEHoraDoServidor();
    }

    public List<CpConfiguracao> consultar(final CpConfiguracao exemplo) {
        Query query = getSessao().getNamedQuery("consultarCpConfiguracoes");

        query.setLong("idTpConfiguracao", exemplo.getCpTipoConfiguracao().getIdTpConfiguracao());

        query.setCacheable(false);
        // query.setCacheRegion(CACHE_QUERY_CONFIGURACAO);
        return query.list();
    }

    public List<CpConfiguracao> consultarConfiguracoesPorTipo(final Long idTipoConfig) {
        Query query = getSessao().getNamedQuery("consultarCpConfiguracoesPorTipo");

        query.setLong("idTpConfiguracao", idTipoConfig);

        query.setCacheable(false);

        return query.list();

    }

    public List<CpConfiguracao> porLotacaoPessoaServicoTipo(final CpConfiguracao exemplo) {
        Query query = getSessao().getNamedQuery("consultarCpConfiguracoesPorLotacaoPessoaServicoTipo");
        query.setLong("idPessoa", exemplo.getDpPessoa().getIdPessoa());
        query.setLong("idLotacao", exemplo.getLotacao().getIdLotacao());
        query.setLong("idTpConfiguracao", exemplo.getCpTipoConfiguracao().getIdTpConfiguracao());
        query.setLong("idServico", exemplo.getCpServico().getIdServico());
        // kpf: com o cache true, as configuracoes sao exibidas de forma forma
        // errada apos a primeira
        query.setCacheable(false);
        // query.setCacheRegion(CACHE_QUERY_CONFIGURACAO);
        return query.list();
    }

    @SuppressWarnings("unchecked")
    public <T> List<T> listarAtivos(Class<T> clazz, String dtFim, long orgaoUsuario) {
        // Criteria crit = getSessao().createCriteria(getPersistentClass());
        // return crit.list();
        // DetachedCriteria criteria = DetachedCriteria.forClass(clazz).add(
        // Property.forName(dtFim).isNull()).add(
        // Property.forName("orgaoUsuario.idOrgaoUsu").eq(orgaoUsuario));

        return findByCriteria(clazz, Property.forName(dtFim).isNull(),
                Property.forName("orgaoUsuario.idOrgaoUsu").eq(orgaoUsuario));
    }

    public <T> List<T> listarAtivos(Class<T> clazz, String orderBy) {
        Criteria c = getSessao().createCriteria(clazz);

        if (orderBy != null) {
            c.addOrder(Order.asc(orderBy));
        }

        c.add(Restrictions.eq("hisAtivo", 1));

        return c.list();

    }

    public <T> T consultarAtivoPorIdInicial(Class<T> clazz, Long hisIdIni) {
        Criteria c = getSessao().createCriteria(clazz);

        c.add(Restrictions.eq("hisIdIni", hisIdIni));
        c.add(Restrictions.eq("hisAtivo", 1));

        T obj = null;
        try {
            obj = (T) c.list().get(0);
        } catch (Exception e) {

        }

        return obj;
    }

    /**
     * Importa logins e senhas do antigo esquema ACESSO_TOMCAT
     * 
     * @return
     * @throws SQLException
     * @throws NumberFormatException
     * @throws SQLException
     * @throws BadPaddingException
     * @throws IllegalBlockSizeException
     * @throws NoSuchPaddingException
     * @throws NoSuchAlgorithmException
     * @throws InvalidKeyException
     * @throws AplicacaoException
     */
    public void importarAcessoTomcat() throws SQLException, InvalidKeyException, NoSuchAlgorithmException,
            NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, AplicacaoException {
        final Date dt = consultarDataEHoraDoServidor();
        final String s = "SELECT * FROM ACESSO_TOMCAT.USUARIO";

        getSessao().doWork(new Work() {
            public void execute(Connection conn) throws SQLException {
                final PreparedStatement ps = conn.prepareStatement(s);
                try {
                    final ResultSet rset = ps.executeQuery();
                    CpTipoIdentidade tid = consultar(1, CpTipoIdentidade.class, false);
                    while (rset.next()) {
                        final String login = (String) rset.getObject(1);
                        final String senha = (String) rset.getObject(2);
                        Long cpf;
                        try {
                            cpf = ((BigDecimal) rset.getObject(4)).longValue();
                        } catch (NullPointerException e1) {
                            System.out.println("CPF nulo:" + login);
                            continue;
                        }
                        if (!Character.isDigit(login.charAt(2))) {
                            System.out.println("Login sem matricula:" + login);
                            continue;
                        }
                        final long longmatricula = Long.parseLong(login.substring(2));

                        DpPessoa pessoa;
                        try {
                            pessoa = consultarPorCpfMatricula(cpf, longmatricula);
                        } catch (org.hibernate.NonUniqueResultException e) {
                            System.out.println("Mais de um registro retornado:" + login);
                            continue;
                        }
                        if (pessoa == null) {
                            System.out.println("Pessoa nao localizada:" + login);
                            continue;
                        }

                        CpIdentidade id = new CpIdentidade();
                        id.setCpOrgaoUsuario(pessoa.getOrgaoUsuario());
                        id.setCpTipoIdentidade(tid);
                        id.setDpPessoa(pessoa);
                        id.setDscSenhaIdentidade(senha);

                        // BASE64Encoder encoderBase64 = new BASE64Encoder();
                        // String chave =
                        // encoderBase64.encode(id.getDpPessoa().getIdInicial()
                        // .toString().getBytes());
                        // String senhaCripto = encoderBase64.encode(Criptografia
                        // .criptografar(senha, chave));
                        // id.setDscSenhaIdentidadeCripto(senhaCripto);
                        // id.setDscSenhaIdentidadeCriptoSinc(senhaCripto);

                        id.setDtCancelamentoIdentidade(null);
                        id.setDtCriacaoIdentidade(dt);
                        id.setDtExpiracaoIdentidade(null);
                        id.setHisDtFim(null);
                        id.setHisDtIni(dt);
                        // id.setIdCpIdentidade(null);
                        id.setNmLoginIdentidade(login);
                        gravar(id);
                        id.setHisIdIni(id.getIdIdentidade());
                        gravar(id);
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                } finally {
                    ps.close();
                }
            }
        });

    }

    public HistoricoAuditavel gravarComHistorico(HistoricoAuditavel oNovo, HistoricoAuditavel oAntigo, Date dt,
            CpIdentidade identidadeCadastrante) throws AplicacaoException {
        if (dt == null)
            dt = CpDao.getInstance().consultarDataEHoraDoServidor();
        oNovo.setHisDtIni(dt);
        if (oAntigo == null) {
            return gravarComHistorico(oNovo, identidadeCadastrante);
        }

        if (oNovo.semelhante(oAntigo, 0)) {
            return oAntigo;
        }

        oAntigo.setHisDtFim(dt);
        gravarComHistorico(oAntigo, identidadeCadastrante);
        return gravarComHistorico(oNovo, identidadeCadastrante);
    }

    public HistoricoAuditavel gravarComHistorico(final HistoricoAuditavel entidade,
            CpIdentidade identidadeCadastrante) throws AplicacaoException {
        if (entidade.getHisDtIni() != null && entidade.getHisIdcIni() == null)
            entidade.setHisIdcIni(identidadeCadastrante);
        if (entidade.getHisDtFim() != null && entidade.getHisIdcFim() == null)
            entidade.setHisIdcFim(identidadeCadastrante);
        entidade.setHisAtivo(entidade.getHisDtFim() == null ? 1 : 0);
        getSessao().saveOrUpdate(entidade);
        if (entidade.getHisIdIni() == null && entidade.getId() != null) {
            entidade.setHisIdIni(entidade.getId());
            getSessao().update(entidade);
        }
        try {
            invalidarCache(entidade);
            Cp.getInstance().getConf().limparCacheSeNecessario();
        } catch (Exception e) {
            throw new AplicacaoException("Nao foi possivel limpar o cache.", 0, e);
        }
        return entidade;
    }

    public <T> T gravar(final T entidade) {
        getSessao().saveOrUpdate(entidade);
        invalidarCache(entidade);
        return entidade;
    }

    public void invalidarCache(Object entidade) {
        if (entidade == null)
            return;
        SessionFactory sfCpDao = CpDao.getInstance().getSessao().getSessionFactory();
        if (entidade instanceof DpSubstituicao) {
            sfCpDao.evict(DpSubstituicao.class);
            sfCpDao.evictQueries(CACHE_QUERY_SUBSTITUICAO);
        }
    }

    static public Configuration criarHibernateCfg(String datasource) throws Exception {

        Configuration cfg = new Configuration();
        cfg.setProperty("hibernate.connection.datasource", datasource);

        return configurarHibernate(cfg);
    }

    static public Configuration criarHibernateCfg(String connectionUrl, String username, String password)
            throws Exception {
        Configuration cfg = new Configuration();
        cfg.setProperty("hibernate.connection.url", connectionUrl);
        cfg.setProperty("hibernate.connection.username", username);
        cfg.setProperty("hibernate.connection.password", password);
        cfg.setProperty("hibernate.connection.driver_class", "oracle.jdbc.driver.OracleDriver");
        cfg.setProperty("c3p0.min_size", "5");
        cfg.setProperty("c3p0.max_size", "20");
        cfg.setProperty("c3p0.timeout", "300");
        cfg.setProperty("c3p0.max_statements", "50");

        return configurarHibernate(cfg);
    }

    static public Configuration criarHibernateCfg(CpAmbienteEnumBL ambiente) throws Exception {
        CpPropriedadeBL prop = Cp.getInstance().getProp();
        prop.setPrefixo(ambiente.getSigla());
        return criarHibernateCfg(ambiente, prop);
    }

    static public Configuration criarHibernateCfg(CpAmbienteEnumBL ambiente, CpPropriedadeBL prop)
            throws Exception {

        Configuration cfg = new Configuration();

        // Isto e para manter o naming strategy do hibernate 3.5 na versao 3.6
        cfg.setNamingStrategy(DefaultNamingStrategy.INSTANCE);
        cfg.setProperty("hibernate.connection.url", prop.urlConexao());
        cfg.setProperty("hibernate.connection.username", prop.usuario());
        cfg.setProperty("hibernate.connection.password", prop.senha());
        cfg.setProperty("hibernate.connection.driver_class", prop.driverConexao());
        cfg.setProperty("c3p0.min_size", prop.c3poMinSize());
        cfg.setProperty("c3p0.max_size", prop.c3poMaxSize());
        cfg.setProperty("c3p0.timeout", prop.c3poTimeout());
        cfg.setProperty("c3p0.max_statements", prop.c3poMaxStatements());

        cfg.setProperty("hibernate.jdbc.use_streams_for_binary", "true");

        configurarHibernate(cfg);
        return cfg;
    }

    static private Configuration configurarHibernate(Configuration cfg) throws Exception {
        cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");

        cfg.setProperty("hibernate.current_session_context_class", "thread");
        cfg.setProperty("hibernate.query.substitutions", "true 1, false 0");

        //cfg.setProperty("hibernate.cache.region.factory_class", "org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory");

        cfg.setProperty("hibernate.cache.use_second_level_cache", "false");
        //      cfg.setProperty("hibernate.cache.infinispan.cachemanager","java:jboss/infinispan/container/hibernate");
        cfg.setProperty("hibernate.transaction.manager_lookup_class",
                "org.hibernate.transaction.JBossTransactionManagerLookup");

        cfg.setProperty("hibernate.cache.use_query_cache", "false");
        cfg.setProperty("hibernate.cache.use_minimal_puts", "false");
        cfg.setProperty("hibernate.max_fetch_depth", "3");
        cfg.setProperty("hibernate.default_batch_fetch_size", "1000");
        //   cfg.setProperty("hibernate.cache.provider_configuration_file_resource_path","classpath:ehcache.xml");
        cfg.setProperty("hibernate.show_sql", "false");

        // descomentar para inpecionar o SQL
        // cfg.setProperty("hibernate.show_sql", "true");
        // cfg.setProperty("hibernate.format_sql", "true");
        // cfg.setProperty("hibernate.use_sql_comments", "true");
        // Disable second-level cache.
        // <property
        // name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>
        // <property name="cache.use_query_cache">false</property>

        cfg.addClass(br.gov.jfrj.siga.dp.DpCargo.class);
        cfg.addClass(br.gov.jfrj.siga.dp.DpFuncaoConfianca.class);
        cfg.addClass(br.gov.jfrj.siga.dp.DpLotacao.class);
        cfg.addClass(br.gov.jfrj.siga.dp.DpPessoa.class);
        cfg.addClass(br.gov.jfrj.siga.dp.CpOrgao.class);
        cfg.addClass(br.gov.jfrj.siga.dp.CpOrgaoUsuario.class);
        cfg.addClass(br.gov.jfrj.siga.dp.DpSubstituicao.class);
        cfg.addClass(br.gov.jfrj.siga.dp.CpFeriado.class);
        cfg.addClass(br.gov.jfrj.siga.dp.CpOcorrenciaFeriado.class);
        cfg.addClass(br.gov.jfrj.siga.dp.CpAplicacaoFeriado.class);
        cfg.addClass(br.gov.jfrj.siga.dp.CpLocalidade.class);
        cfg.addClass(br.gov.jfrj.siga.dp.CpUF.class);
        cfg.addClass(br.gov.jfrj.siga.dp.CpPersonalizacao.class);
        cfg.addClass(br.gov.jfrj.siga.dp.CpTipoPessoa.class);
        cfg.addClass(br.gov.jfrj.siga.cp.CpConfiguracao.class);
        cfg.addClass(br.gov.jfrj.siga.cp.CpSituacaoConfiguracao.class);
        cfg.addClass(br.gov.jfrj.siga.cp.CpTipoConfiguracao.class);
        cfg.addClass(br.gov.jfrj.siga.cp.CpServico.class);
        cfg.addClass(br.gov.jfrj.siga.cp.CpTipoGrupo.class);
        cfg.addClass(br.gov.jfrj.siga.cp.CpGrupo.class);
        cfg.addClass(br.gov.jfrj.siga.dp.CpTipoLotacao.class);
        cfg.addClass(br.gov.jfrj.siga.cp.CpTipoPapel.class);
        cfg.addClass(br.gov.jfrj.siga.cp.CpPapel.class);
        cfg.addClass(br.gov.jfrj.siga.cp.CpTipoServico.class);
        cfg.addClass(br.gov.jfrj.siga.cp.CpTipoIdentidade.class);
        cfg.addClass(br.gov.jfrj.siga.cp.CpIdentidade.class);
        cfg.addClass(br.gov.jfrj.siga.cp.CpModelo.class);
        cfg.addClass(br.gov.jfrj.siga.cp.CpUnidadeMedida.class);
        cfg.addClass(br.gov.jfrj.siga.cp.CpComplexo.class);

        // <!--
        // <mapping resource="br/gov/jfrj/siga/dp/CpTipoMarcador.hbm.xml" />
        // <mapping resource="br/gov/jfrj/siga/dp/CpMarcador.hbm.xml" />
        // <mapping resource="br/gov/jfrj/siga/dp/CpTipoMarca.hbm.xml" />
        // <mapping resource="br/gov/jfrj/siga/dp/CpMarca.hbm.xml" />
        // -->

        CacheManager manager = CacheManager.getInstance();
        Cache cache;
        CacheConfiguration config;

        if (!manager.cacheExists(CACHE_QUERY_HOURS)) {
            manager.addCache(CACHE_QUERY_HOURS);
            cache = manager.getCache(CACHE_QUERY_HOURS);
            config = cache.getCacheConfiguration();
            config.setTimeToIdleSeconds(3600);
            config.setTimeToLiveSeconds(36000);
            config.setEternal(false);
            config.setMaxElementsInMemory(10000);
            config.setOverflowToDisk(false);
            config.setMaxElementsOnDisk(0);
        }

        if (!manager.cacheExists(CACHE_QUERY_SECONDS)) {
            manager.addCache(CACHE_QUERY_SECONDS);
            cache = manager.getCache(CACHE_QUERY_SECONDS);
            config = cache.getCacheConfiguration();
            config.setTimeToIdleSeconds(5);
            config.setTimeToLiveSeconds(5);
            config.setEternal(false);
            config.setMaxElementsInMemory(10000);
            config.setOverflowToDisk(false);
            config.setMaxElementsOnDisk(0);
        }

        if (!manager.cacheExists(CACHE_QUERY_SUBSTITUICAO)) {
            manager.addCache(CACHE_QUERY_SUBSTITUICAO);
            cache = manager.getCache(CACHE_QUERY_SUBSTITUICAO);
            config = cache.getCacheConfiguration();
            config.setTimeToIdleSeconds(300);
            config.setTimeToLiveSeconds(3600);
            config.setEternal(false);
            config.setMaxElementsInMemory(10000);
            config.setOverflowToDisk(false);
            config.setMaxElementsOnDisk(0);
        }

        if (!manager.cacheExists(CACHE_SECONDS)) {
            manager.addCache(CACHE_SECONDS);
            cache = manager.getCache(CACHE_SECONDS);
            config = cache.getCacheConfiguration();
            config.setTimeToIdleSeconds(5);
            config.setTimeToLiveSeconds(5);
            config.setEternal(false);
            config.setMaxElementsInMemory(10000);
            config.setOverflowToDisk(false);
            config.setMaxElementsOnDisk(0);
        }

        if (!manager.cacheExists(CACHE_CORPORATIVO)) {
            manager.addCache(CACHE_CORPORATIVO);
            cache = manager.getCache(CACHE_CORPORATIVO);
            config = cache.getCacheConfiguration();
            config.setEternal(true);
            config.setMaxElementsInMemory(10000);
            config.setOverflowToDisk(false);
            config.setMaxElementsOnDisk(0);
        }

        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.dp.CpTipoLotacao", "transactional", CACHE_CORPORATIVO);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.dp.DpLotacao", "transactional", CACHE_CORPORATIVO);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.dp.CpTipoPessoa", "transactional", CACHE_CORPORATIVO);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.dp.DpPessoa", "transactional", CACHE_CORPORATIVO);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.dp.DpFuncaoConfianca", "transactional",
                CACHE_CORPORATIVO);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.dp.CpOrgaoUsuario", "transactional", CACHE_CORPORATIVO);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.dp.DpCargo", "transactional", CACHE_CORPORATIVO);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.dp.CpOrgao", "transactional", CACHE_CORPORATIVO);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.dp.CpLocalidade", "transactional", CACHE_CORPORATIVO);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.dp.CpUF", "transactional", CACHE_CORPORATIVO);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.dp.CpFeriado", "transactional", CACHE_CORPORATIVO);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.cp.CpTipoServico", "transactional", CACHE_CORPORATIVO);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.cp.CpServico", "transactional", CACHE_CORPORATIVO);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.cp.CpTipoConfiguracao", "transactional",
                CACHE_CORPORATIVO);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.cp.CpTipoIdentidade", "transactional", CACHE_CORPORATIVO);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.cp.CpTipoPapel", "transactional", CACHE_CORPORATIVO);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.cp.CpTipoGrupo", "transactional", CACHE_CORPORATIVO);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.cp.CpIdentidade", "transactional", CACHE_SECONDS);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.dp.DpSubstituicao", "transactional",
                CACHE_QUERY_SUBSTITUICAO);

        return cfg;
    }

    public DpPessoa getPessoaFromSigla(String sigla) {
        DpPessoa p = new DpPessoa();
        p.setSigla(sigla);
        DpPessoa ator = consultarPorSigla(p);
        return ator;
    }

    public DpLotacao getLotacaoFromSigla(String sigla) {
        DpLotacaoDaoFiltro flt = new DpLotacaoDaoFiltro();
        flt.setSiglaCompleta(sigla);
        return (DpLotacao) consultarPorSigla(flt);
    }

    public CpOrgao getOrgaoFromSigla(String sigla) {
        CpOrgao o = new CpOrgao();
        o.setSigla(sigla);
        return consultarPorSigla(o);
    }

    public CpOrgao getOrgaoFromSiglaExata(String sigla) {
        CpOrgao o = new CpOrgao();
        o.setSigla(sigla);

        final Query query = getSessao().getNamedQuery("consultarPorSiglaExataCpOrgao");
        query.setString("siglaOrgao", o.getSiglaOrgao());

        final List<CpOrgao> l = query.list();
        if (l.size() > 0)
            return l.get(0);

        return null;
    }

    public List<CpOrgaoUsuario> consultaCpOrgaoUsuario() {
        final Query qry = getSessao().getNamedQuery("consultarCpOrgaoUsuario");

        // Renato: Alterei para fazer cache. Nao vejo porque nao possamos fazer
        // cache dessa consulta.
        qry.setCacheable(true);
        qry.setCacheRegion(CACHE_QUERY_HOURS);

        final List<CpOrgaoUsuario> lista = qry.list();
        return lista;
    }

    public List<CpModelo> consultaCpModelos() {
        final List<CpOrgaoUsuario> listaOrgUsu = consultaCpOrgaoUsuario();
        listaOrgUsu.add(0, null);
        final Query qry = getSessao().getNamedQuery("consultarCpModelos");

        qry.setCacheable(true);
        qry.setCacheRegion(CACHE_QUERY_SECONDS);

        final List<CpModelo> lista = qry.list();
        final List<CpModelo> listaFinal = new ArrayList<CpModelo>();

        for (CpOrgaoUsuario orgUsu : listaOrgUsu) {
            boolean fFound = false;
            for (CpModelo mod : lista) {
                if ((mod.getCpOrgaoUsuario() == null && orgUsu == null) || (mod.getCpOrgaoUsuario() != null
                        && orgUsu != null && mod.getCpOrgaoUsuario().getId().equals(orgUsu.getId()))) {
                    listaFinal.add(mod);
                    fFound = true;
                }
            }
            if (!fFound) {
                CpModelo modNew = new CpModelo();
                modNew.setCpOrgaoUsuario(orgUsu);
                listaFinal.add(modNew);
            }
        }
        return listaFinal;
    }

    public List<CpModelo> listarModelosOrdenarPorNome(String script) throws Exception {
        final Criteria crit = getSessao().createCriteria(CpModelo.class);
        crit.add(Property.forName("hisDtFim").isNull());
        crit.createAlias("cpOrgaoUsuario", "o", Criteria.LEFT_JOIN);
        crit.addOrder(Order.desc("o.siglaOrgaoUsu"));
        List<CpModelo> l = new ArrayList<CpModelo>();
        for (CpModelo mod : (List<CpModelo>) crit.list())
            if (script != null && script.trim().length() != 0) {
                if (mod.getConteudoBlobString() != null && mod.getConteudoBlobString().contains(script))
                    l.add(mod);
            } else
                l.add(mod);
        return l;
    }

    public CpServico consultarPorSiglaCpServico(String siglaServico) {
        final Query query = getSessao().getNamedQuery("consultarPorSiglaStringCpServico");
        query.setString("siglaServico", siglaServico);
        // query.setFlushMode(FlushMode.MANUAL);
        final List<CpServico> l = query.list();
        if (l.size() != 1) {
            return null;
        }

        return l.get(0);
    }

    @SuppressWarnings("unchecked")
    public List<CpOrgaoUsuario> listarOrgaosUsuarios() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, CpOrgaoUsuario.class);
    }

    @SuppressWarnings("unchecked")
    public List<CpOrgao> listarOrgaos() {
        return findByCriteria(CpOrgao.class);
    }

    @SuppressWarnings("unchecked")
    public List<CpServico> listarServicos() {
        return findByCriteria(CpServico.class);
    }

    @SuppressWarnings("unchecked")
    public List<CpTipoGrupo> listarTiposGrupo() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, CpTipoGrupo.class);
    }

    @SuppressWarnings("unchecked")
    public List<CpConfiguracao> listarConfiguracoes() {
        return findByCriteria(CpConfiguracao.class);
    }

    @SuppressWarnings("unchecked")
    public List<DpLotacao> listarLotacoes() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, DpLotacao.class);
    }

    @SuppressWarnings("unchecked")
    public List<CpTipoLotacao> listarTiposLotacao() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, CpTipoLotacao.class);
    }

    @SuppressWarnings("unchecked")
    public List<CpTipoPessoa> listarTiposPessoa() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, CpTipoPessoa.class);
    }

    @SuppressWarnings("unchecked")
    public List<CpTipoPapel> listarTiposPapel() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, CpTipoPapel.class);
    }

    @SuppressWarnings("unchecked")
    public List<CpFeriado> listarFeriados() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, CpFeriado.class);
    }

    @SuppressWarnings("unchecked")
    public List<CpSituacaoConfiguracao> listarSituacoesConfiguracao() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, CpSituacaoConfiguracao.class);
    }

    public List<CpTipoConfiguracao> listarTiposConfiguracao() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, CpTipoConfiguracao.class);
    }

    public List<CpUnidadeMedida> listarUnidadesMedida() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, CpUnidadeMedida.class);
    }

    public List<CpMarcador> listarMarcadores() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, CpMarcador.class);
    }

    public List<CpGrupoDeEmail> listarGruposDeEmail() {
        return findByCriteria(CpGrupoDeEmail.class);
    }

    public void excluirComHistorico(HistoricoAuditavel entidade, Date dt, CpIdentidade identidadeCadastrante)
            throws AplicacaoException {

        if (dt == null) {
            dt = consultarDataEHoraDoServidor();
        }
        entidade.setHisDtFim(dt);
        entidade.setHisIdcFim(identidadeCadastrante);
        entidade.setHisAtivo(0);

        gravarComHistorico(entidade, identidadeCadastrante);

    }

    public List<CpGrupo> getGruposGeridos(DpPessoa titular, DpLotacao lotaTitular, Long idCpTipoGrupo)
            throws Exception {
        CpGrupoDaoFiltro flt = new CpGrupoDaoFiltro();
        flt.setIdTpGrupo(idCpTipoGrupo.intValue());
        List<CpGrupo> itgGrupos = consultarPorFiltro(flt, 0, 0);

        Iterator<CpGrupo> it = itgGrupos.iterator();

        while (it.hasNext()) {
            CpGrupo cpGrp = it.next();
            CpConfiguracaoBL bl = Cp.getInstance().getConf();
            if (!bl.podePorConfiguracao(titular, lotaTitular, cpGrp,
                    CpTipoConfiguracao.TIPO_CONFIG_GERENCIAR_GRUPO)) {
                it.remove();
            }

        }
        return itgGrupos;
    }

    @SuppressWarnings("unchecked")
    public Object consultaDadosBasicos(final String nmUsuario) throws AplicacaoException {
        try {
            final Query qry = getSessao().getNamedQuery("consultarDadosBasicos");
            qry.setString("nmUsuario", nmUsuario);
            // Verifica se existe numeros no login do usuario
            if (nmUsuario.substring(2).matches("^[0-9]*$"))
                qry.setString("sesbPessoa", nmUsuario.substring(0, 2));
            else
                // se nao ha numeros atribui RJ por default
                qry.setString("sesbPessoa", "RJ");

            // Cache was disabled because it would interfere with the
            // "change password" action.
            // qry.setCacheable(true);
            // qry.setCacheRegion("query.IdentidadeCadastrante");

            final Object obj = qry.list();
            return obj;
        } catch (Throwable e) {
            throw new AplicacaoException(
                    "Ocorreu um erro tentando carregar os dados basicos para o usuario '" + nmUsuario + "'.", 0, e);
        }
    }

    public List<DpPessoa> consultarPorMatriculaEOrgao(Long matricula, Long idOrgaoUsu, boolean pessoasFinalizadas,
            boolean ordemDesc) {
        Criteria c = HibernateUtil.getSessao().createCriteria(DpPessoa.class);
        c.add(Restrictions.eq("matricula", matricula));
        c.add(Restrictions.eq("orgaoUsuario.idOrgaoUsu", idOrgaoUsu));

        if (pessoasFinalizadas) {
            c.add(Restrictions.isNotNull("dataFimPessoa"));
        } else {
            c.add(Restrictions.isNull("dataFimPessoa"));
        }
        if (ordemDesc) {
            c.addOrder(Order.desc("dataInicioPessoa"));
        } else {
            c.addOrder(Order.asc("dataInicioPessoa"));
        }

        return c.list();

    }

    public List<?> consultarFechadosPorIdExterna(Class<?> clazz, String idExterna, Long idOrgaoUsu) {
        if (clazz == DpLotacao.class) {
            Criteria c = HibernateUtil.getSessao().createCriteria(DpLotacao.class);
            c.add(Restrictions.eq("ideLotacao", idExterna));
            c.add(Restrictions.eq("orgaoUsuario.idOrgaoUsu", idOrgaoUsu));
            c.add(Restrictions.isNotNull("dataFimLotacao"));
            c.addOrder(Order.desc("dataInicioLotacao"));
            return c.list();
        }

        if (clazz == DpCargo.class) {
            Criteria c = HibernateUtil.getSessao().createCriteria(DpCargo.class);
            c.add(Restrictions.eq("ideCargo", idExterna));
            c.add(Restrictions.eq("orgaoUsuario.idOrgaoUsu", idOrgaoUsu));
            c.add(Restrictions.isNotNull("dataFimCargo"));
            c.addOrder(Order.desc("dataInicioCargo"));
            return c.list();
        }

        if (clazz == DpFuncaoConfianca.class) {
            Criteria c = HibernateUtil.getSessao().createCriteria(DpFuncaoConfianca.class);
            c.add(Restrictions.eq("ideFuncao", idExterna));
            c.add(Restrictions.eq("orgaoUsuario.idOrgaoUsu", idOrgaoUsu));
            c.add(Restrictions.isNotNull("dataFimFuncao"));
            c.addOrder(Order.desc("dataInicioFuncao"));
            return c.list();
        }

        return null;
    }

}