br.gov.jfrj.siga.hibernate.ExDao.java Source code

Java tutorial

Introduction

Here is the source code for br.gov.jfrj.siga.hibernate.ExDao.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.hibernate;

import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

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

import org.apache.lucene.analysis.br.BrazilianAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.index.Term;
import org.apache.lucene.queryParser.MultiFieldQueryParser;
import org.apache.lucene.queryParser.QueryParser;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.util.Version;
import org.hibernate.CacheMode;
import org.hibernate.Criteria;
import org.hibernate.FlushMode;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.hibernate.jdbc.Work;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.jboss.logging.Logger;

import br.gov.jfrj.siga.base.AplicacaoException;
import br.gov.jfrj.siga.base.Texto;
import br.gov.jfrj.siga.base.util.Catalogs;
import br.gov.jfrj.siga.cp.CpTipoConfiguracao;
import br.gov.jfrj.siga.cp.bl.CpAmbienteEnumBL;
import br.gov.jfrj.siga.cp.bl.CpPropriedadeBL;
import br.gov.jfrj.siga.dp.CpOrgaoUsuario;
import br.gov.jfrj.siga.dp.DpLotacao;
import br.gov.jfrj.siga.dp.DpPessoa;
import br.gov.jfrj.siga.dp.dao.CpDao;
import br.gov.jfrj.siga.ex.ExBoletimDoc;
import br.gov.jfrj.siga.ex.ExClassificacao;
import br.gov.jfrj.siga.ex.ExConfiguracao;
import br.gov.jfrj.siga.ex.ExDocumento;
import br.gov.jfrj.siga.ex.ExEmailNotificacao;
import br.gov.jfrj.siga.ex.ExEstadoDoc;
import br.gov.jfrj.siga.ex.ExFormaDocumento;
import br.gov.jfrj.siga.ex.ExItemDestinacao;
import br.gov.jfrj.siga.ex.ExMobil;
import br.gov.jfrj.siga.ex.ExModelo;
import br.gov.jfrj.siga.ex.ExMovimentacao;
import br.gov.jfrj.siga.ex.ExNivelAcesso;
import br.gov.jfrj.siga.ex.ExPapel;
import br.gov.jfrj.siga.ex.ExPreenchimento;
import br.gov.jfrj.siga.ex.ExTipoDespacho;
import br.gov.jfrj.siga.ex.ExTipoDestinacao;
import br.gov.jfrj.siga.ex.ExTipoDocumento;
import br.gov.jfrj.siga.ex.ExTipoFormaDoc;
import br.gov.jfrj.siga.ex.ExTipoMobil;
import br.gov.jfrj.siga.ex.ExTipoMovimentacao;
import br.gov.jfrj.siga.ex.ExTpDocPublicacao;
import br.gov.jfrj.siga.ex.ExVia;
import br.gov.jfrj.siga.ex.SigaExProperties;
import br.gov.jfrj.siga.ex.bl.Ex;
import br.gov.jfrj.siga.ex.util.MascaraUtil;
import br.gov.jfrj.siga.hibernate.ext.IExMobilDaoFiltro;
import br.gov.jfrj.siga.hibernate.ext.IMontadorQuery;
import br.gov.jfrj.siga.hibernate.ext.MontadorQuery;
import br.gov.jfrj.siga.model.Selecionavel;
import br.gov.jfrj.siga.model.dao.ModeloDao;
import br.gov.jfrj.siga.persistencia.Aguarde;
import br.gov.jfrj.siga.persistencia.ExClassificacaoDaoFiltro;
import br.gov.jfrj.siga.persistencia.ExDocumentoDaoFiltro;
import br.gov.jfrj.siga.persistencia.ExMobilDaoFiltro;

@SuppressWarnings({ "unchecked", "rawtypes" })
public class ExDao extends CpDao {

    public static final String CACHE_EX = "ex";

    private static final Logger log = Logger.getLogger(ExDao.class);

    IMontadorQuery montadorQuery = null;

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

    public ExDao() {
        try {
            montadorQuery = (IMontadorQuery) Class.forName(SigaExProperties.getMontadorQuery()).newInstance();
            montadorQuery.setMontadorPrincipal(new MontadorQuery());
        } catch (Exception e) {
            montadorQuery = new MontadorQuery();
        }
    }

    public void reindexarVarios(List<ExDocumento> docs, boolean apenasExcluir) throws Exception {
        FullTextSession fullTextSession = Search.getFullTextSession(getSessao());
        Transaction tx = fullTextSession.beginTransaction();
        for (ExDocumento doc : docs) {
            fullTextSession.purge(ExDocumento.class, doc);
            if ((!apenasExcluir) && doc.isIndexavel())
                fullTextSession.index(doc);
        }
        tx.commit();
        fullTextSession.clear();
        getSessao().clear();
    }

    public List<ExDocumento> consultarEmLotePorId(Object[] ids) {
        if (ids.length > 0) {
            String clausula = " where ";
            StringBuffer appender = new StringBuffer("from ExDocumento doc");
            for (int k = 0; k < ids.length; k++) {
                appender.append(clausula);
                appender.append("doc.idDoc = ");
                appender.append(ids[k]);
                if (k == 0)
                    clausula = " or ";
            }
            Query query = getSessao().createQuery(appender.toString());
            return query.list();
        }
        return null;
    }

    public Long obterProximoNumero(final ExDocumento doc, Long anoEmissao) throws SQLException {
        Query query = getSessao().getNamedQuery("obterProximoNumero");
        query.setLong("idOrgaoUsu", doc.getOrgaoUsuario().getId());
        query.setLong("idFormaDoc", doc.getExFormaDocumento().getId());
        query.setLong("anoEmissao", anoEmissao);

        return (Long) query.uniqueResult();
    }

    public List consultarPorFiltro(final ExMobilDaoFiltro flt) {
        return consultarPorFiltro(flt, 0, 0);
    }

    public List consultarPorFiltro(final ExMobilDaoFiltro flt, final int offset, final int itemPagina) {
        return consultarPorFiltro(flt, 0, 0, new DpPessoa(), new DpLotacao());
    }

    public List consultarPorFiltro(final ExMobilDaoFiltro flt, DpPessoa titular, DpLotacao lotaTitular) {
        return consultarPorFiltro(flt, 0, 0, titular, lotaTitular);
    }

    public List consultarPorFiltroOtimizado(final ExMobilDaoFiltro flt) {
        return consultarPorFiltroOtimizado(flt, 0, 0);
    }

    public List consultarPorFiltroOtimizado(final ExMobilDaoFiltro flt, final int offset, final int itemPagina) {
        return consultarPorFiltroOtimizado(flt, 0, 0, new DpPessoa(), new DpLotacao());
    }

    public List consultarPorFiltroOtimizado(final ExMobilDaoFiltro flt, DpPessoa titular, DpLotacao lotaTitular) {
        return consultarPorFiltroOtimizado(flt, 0, 0, titular, lotaTitular);
    }

    public List consultarPorFiltro(final ExMobilDaoFiltro flt, final int offset, final int itemPagina,
            DpPessoa titular, DpLotacao lotaTitular) {

        Query query = getSessao().getNamedQuery("consultarPorFiltro");
        if (offset > 0) {
            query.setFirstResult(offset);
        }
        if (itemPagina > 0) {
            query.setMaxResults(itemPagina);
        }
        query.setProperties(flt);
        query.setLong("titular", titular.getIdPessoaIni() != null ? titular.getIdPessoaIni() : 0);
        query.setLong("lotaTitular", lotaTitular.getIdLotacaoIni() != null ? lotaTitular.getIdLotacaoIni() : 0);
        List l = query.list();
        return l;
    }

    public void preencherParametros(final IExMobilDaoFiltro flt, final Query query) {
        if (flt.getUltMovIdEstadoDoc() != null && flt.getUltMovIdEstadoDoc() != 0) {

            query.setLong("ultMovIdEstadoDoc", flt.getUltMovIdEstadoDoc());

        }

        if (flt.getUltMovRespSelId() != null && flt.getUltMovRespSelId() != 0) {

            query.setLong("ultMovRespSelId", flt.getUltMovRespSelId());
        }

        if (flt.getUltMovLotaRespSelId() != null && flt.getUltMovLotaRespSelId() != 0) {

            query.setLong("ultMovLotaRespSelId", flt.getUltMovLotaRespSelId());
        }

        if (flt.getIdTipoMobil() != null && flt.getIdTipoMobil() != 0) {

            query.setLong("idTipoMobil", flt.getIdTipoMobil());
        }

        if (flt.getNumSequencia() != null && flt.getNumSequencia() != 0) {

            query.setLong("numSequencia", flt.getNumSequencia());
        }

        if (flt.getIdOrgaoUsu() != null && flt.getIdOrgaoUsu() != 0) {

            query.setLong("idOrgaoUsu", flt.getIdOrgaoUsu());
        }

        if (flt.getAnoEmissao() != null && flt.getAnoEmissao() != 0) {
            query.setLong("anoEmissao", flt.getAnoEmissao());
        }

        if (flt.getNumExpediente() != null && flt.getNumExpediente() != 0) {
            query.setLong("numExpediente", flt.getNumExpediente());
        }

        if (flt.getIdTpDoc() != null && flt.getIdTpDoc() != 0) {
            query.setLong("idTpDoc", flt.getIdTpDoc());
        }

        if (flt.getIdFormaDoc() != null && flt.getIdFormaDoc() != 0) {
            query.setLong("idFormaDoc", flt.getIdFormaDoc());
        }

        if (flt.getIdTipoFormaDoc() != null && flt.getIdTipoFormaDoc() != 0) {
            query.setLong("idTipoFormaDoc", flt.getIdTipoFormaDoc());
        }

        if (flt.getClassificacaoSelId() != null && flt.getClassificacaoSelId() != 0) {
            query.setLong("classificacaoSelId", flt.getClassificacaoSelId());
        }

        if (flt.getDescrDocumento() != null

                && !flt.getDescrDocumento().trim().equals("")) {
            query.setString("descrDocumento", "%" + flt.getDescrDocumento().toUpperCase() + "%");
        }

        if (flt.getDtDoc() != null) {
            query.setString("dtDoc", new SimpleDateFormat("dd/MM/yyyy").format(flt.getDtDoc()));
        }

        if (flt.getDtDocFinal() != null) {
            query.setString("dtDocFinal", new SimpleDateFormat("dd/MM/yyyy").format(flt.getDtDocFinal()));
        }

        if (flt.getNumAntigoDoc() != null

                && !flt.getNumAntigoDoc().trim().equals("")) {
            query.setString("numAntigoDoc", "%" + flt.getNumAntigoDoc().toUpperCase() + "%");
        }

        if (flt.getDestinatarioSelId() != null && flt.getDestinatarioSelId() != 0) {
            query.setLong("destinatarioSelId", flt.getDestinatarioSelId());
        }

        if (flt.getLotacaoDestinatarioSelId() != null && flt.getLotacaoDestinatarioSelId() != 0) {
            query.setLong("lotacaoDestinatarioSelId", flt.getLotacaoDestinatarioSelId());
        }

        if (flt.getNmDestinatario() != null && !flt.getNmDestinatario().trim().equals("")) {
            query.setString("nmDestinatario", "%" + flt.getNmDestinatario() + "%");
        }

        if (flt.getCadastranteSelId() != null && flt.getCadastranteSelId() != 0) {
            query.setLong("cadastranteSelId", flt.getCadastranteSelId());
        }

        if (flt.getLotaCadastranteSelId() != null && flt.getLotaCadastranteSelId() != 0) {
            query.setLong("lotaCadastranteSelId", flt.getLotaCadastranteSelId());
        }

        if (flt.getSubscritorSelId() != null && flt.getSubscritorSelId() != 0) {
            query.setLong("subscritorSelId", flt.getSubscritorSelId());
        }

        if (flt.getNmSubscritorExt() != null

                && !flt.getNmSubscritorExt().trim().equals("")) {
            query.setString("nmSubscritorExt", "%" + flt.getNmSubscritorExt().toUpperCase() + "%");
        }

        if (flt.getOrgaoExternoSelId() != null && flt.getOrgaoExternoSelId() != 0) {
            query.setLong("orgaoExternoSelId", flt.getOrgaoExternoSelId());
        }

        if (flt.getNumExtDoc() != null && !flt.getNumExtDoc().trim().equals("")) {
            query.setString("numExtDoc", "%" + flt.getNumExtDoc() + "%");
        }

        if (flt.getIdMod() != null && flt.getIdMod() != 0) {
            ExModelo mod = ExDao.getInstance().consultar(flt.getIdMod(), ExModelo.class, false);
            query.setLong("hisIdIni", mod.getHisIdIni());
        }
    }

    public List consultarPorFiltroOtimizado(final ExMobilDaoFiltro flt, final int offset, final int itemPagina,
            DpPessoa titular, DpLotacao lotaTitular) {
        long tempoIni = System.nanoTime();
        Query query = getSessao()
                .createQuery(montadorQuery.montaQueryConsultaporFiltro(flt, titular, lotaTitular, false));
        preencherParametros(flt, query);

        if (offset > 0) {
            query.setFirstResult(offset);
        }
        if (itemPagina > 0) {
            query.setMaxResults(itemPagina);
        }
        List l = query.list();
        long tempoTotal = System.nanoTime() - tempoIni;
        System.out.println(
                "consultarPorFiltroOtimizado: " + tempoTotal / 1000000 + " ms -> " + query + ", resultado: " + l);
        return l;
    }

    public Integer consultarQuantidadePorFiltroOtimizado(final ExMobilDaoFiltro flt, DpPessoa titular,
            DpLotacao lotaTitular) {
        long tempoIni = System.nanoTime();
        String s = montadorQuery.montaQueryConsultaporFiltro(flt, titular, lotaTitular, true);
        Query query = getSessao().createQuery(s);

        preencherParametros(flt, query);

        Long l = (Long) query.uniqueResult();
        long tempoTotal = System.nanoTime() - tempoIni;
        System.out.println("consultarQuantidadePorFiltroOtimizado: " + tempoTotal / 1000000 + " ms -> " + s
                + ", resultado: " + l);
        return l.intValue();
    }

    public List consultarPorFiltroOld(final ExMobilDaoFiltro flt, final int offset, final int itemPagina,
            DpPessoa titular, DpLotacao lotaTitular) {
        try {
            final Query query = getSessao().getNamedQuery("consultarPorFiltro");
            if (offset > 0) {
                query.setFirstResult(offset);
            }
            if (itemPagina > 0) {
                query.setMaxResults(itemPagina);
            }
            query.setProperties(flt);
            if (titular.getIdPessoaIni() != null)
                query.setLong("titular", titular.getIdPessoaIni());
            else
                query.setLong("titular", 0);
            if (lotaTitular.getIdLotacaoIni() != null)
                query.setLong("lotaTitular", lotaTitular.getIdLotacaoIni());
            else
                query.setLong("lotaTitular", 0);

            if (flt.getDescrDocumento() != null)
                query.setString("descrDocumento", flt.getDescrDocumento().toUpperCase().replace(' ', '%'));

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

    public Integer consultarQuantidadePorFiltro(final ExMobilDaoFiltro flt, DpPessoa titular,
            DpLotacao lotaTitular) {
        Query query = getSessao().getNamedQuery("consultarQuantidadePorFiltro");
        query.setProperties(flt);
        query.setLong("titular", titular.getIdPessoaIni());
        query.setLong("lotaTitular", lotaTitular.getIdLotacaoIni());
        long tempoIni = System.nanoTime();
        Long l = (Long) query.uniqueResult();
        long tempoTotal = System.nanoTime() - tempoIni;
        System.out.println("consultarQuantidadePorFiltro: " + tempoTotal / 1000000 + ", resultado: " + l);
        return l.intValue();
    }

    public int consultarQuantidade(final ExDocumentoDaoFiltro flt) {
        // TODO Auto-generated method stub
        return 0;
    }

    public ExMobil consultarPorSigla(final ExMobilDaoFiltro flt) {
        try {
            if (flt.getIdDoc() != null
                    && (flt.getIdTipoMobil() == null || flt.getIdTipoMobil() == ExTipoMobil.TIPO_MOBIL_GERAL)) {
                final ExDocumento d = consultar(flt.getIdDoc(), ExDocumento.class, false);
                return d.getMobilGeral();
            }

            if (flt.getAnoEmissao() == null)
                flt.setAnoEmissao(Long.valueOf(new Date().getYear()) + 1900);

            if (flt.getNumSequencia() == null) {
                final Query query = getSessao().getNamedQuery("consultarPorSiglaDocumento");
                query.setProperties(flt);

                final List<ExDocumento> l = query.list();

                if (l.size() != 1)
                    return null;

                return l.get(0).getMobilGeral();
            }

            final Query query = getSessao().getNamedQuery("consultarPorSigla");
            query.setProperties(flt);

            final List<ExMobil> l = query.list();

            if (l.size() != 1)
                return null;

            final ExMobil retorno = new ExMobil();

            return l.get(0);

        } catch (final NullPointerException e) {
            return null;
        }
    }

    public long obterProximoNumeroVia(final ExDocumento doc) throws Exception {

        return doc.getNumUltimaVia() + 1;

    }

    public List<ExFormaDocumento> listarTodosOrdenarPorDescricao() {
        final Criteria crit = getSessao().createCriteria(ExFormaDocumento.class);
        crit.addOrder(Order.asc("descrFormaDoc"));
        return crit.list();
    }

    public List<ExFormaDocumento> listarTodosOrdenarPorSigla() {
        final Criteria crit = getSessao().createCriteria(ExFormaDocumento.class);
        crit.addOrder(Order.asc("siglaFormaDoc"));
        return crit.list();
    }

    public List<ExDocumento> consultarPorModeloEAssinatura(CpOrgaoUsuario orgaoUsu, ExModelo mod,
            Date dtAssinaturaIni, Date dtAssinaturaFim) {
        if (mod != null) {
            final Query query = getSessao().getNamedQuery("consultarPorModeloEAssinatura");
            query.setLong("idOrgaoUsu", orgaoUsu.getIdOrgaoUsu());
            query.setLong("idMod", mod.getIdMod());
            query.setDate("dataIni", dtAssinaturaIni);
            query.setDate("dataFim", dtAssinaturaFim);
            return query.list();
        }
        return null;
    }

    public Object[] consultarPorTexto(String query) throws Exception {
        return consultarPorTexto(query, 0, 0);
    }

    public Object[] consultarPorTexto(String query, int offset, int itemPagina) throws Exception {

        // Substitui n espaos brancos seguidos de letra ou nmero por " +"
        // As duas linhas abaixo podero ser substitudas por uma
        // query = "+"+query.replaceAll("(\\s+)", " +");
        // query = query.replaceAll("\\+\\-", "-");

        QueryParser parser = new MultiFieldQueryParser(Version.LUCENE_36,
                new String[] { "conteudoBlobDocHtml", "nmMod", "descrDocumento",
                        "exMovimentacaoIndexacaoSet.descrMov", "exMovimentacaoIndexacaoSet.descrTipoMovimentacao",
                        "exMovimentacaoIndexacaoSet.conteudoBlobMovHtml",
                        "exMovimentacaoIndexacaoSet.conteudoBlobMovPdf" },
                new BrazilianAnalyzer(Version.LUCENE_36));

        parser.setDefaultOperator(QueryParser.AND_OPERATOR);

        org.apache.lucene.search.Query luceneQuery = parser.parse(query);

        // ------------------------------- hibernate search query:

        FullTextSession fullTextSession = Search.getFullTextSession(getSessao());

        FullTextQuery hbQuery = fullTextSession.createFullTextQuery(luceneQuery, ExDocumento.class);

        if (offset > 0) {
            hbQuery.setFirstResult(offset);
        }
        if (itemPagina > 0) {
            hbQuery.setMaxResults(itemPagina);
        }

        hbQuery.setCacheable(true);

        hbQuery.setProjection("descrDocumento", "nmMod", "codigo", "idDoc", "dtDocDDMMYY", "subscritorString",
                "destinatarioString", "nivelAcesso");

        return new Object[] { hbQuery.list(), hbQuery.getResultSize() };
    }

    public void listarNaoIndexados(int aPartir, boolean irIndexando) throws Exception {

        long tempoIni = System.currentTimeMillis();
        FullTextSession fullTextSession = Search.getFullTextSession(getSessao());
        QueryParser parser = new QueryParser(Version.LUCENE_36, "idDoc", new StandardAnalyzer(Version.LUCENE_36));

        final Criteria crit = getSessao().createCriteria(ExDocumento.class)
                .add(Restrictions.gt("idDoc", new Long(aPartir)));
        crit.setMaxResults(300);
        crit.addOrder(Order.asc("idDoc"));
        List<ExDocumento> list = new ArrayList<ExDocumento>();
        int firstResult = 0;
        do {
            crit.setFirstResult(firstResult);
            list = crit.list();
            for (ExDocumento doc : list) {
                firstResult++;
                if (doc.isIndexavel() && (fullTextSession
                        .createFullTextQuery(new TermQuery(new Term("idDoc", String.valueOf(doc.getIdDoc()))),
                                ExDocumento.class)
                        .getResultSize() == 0)) {

                    if (irIndexando) {
                        System.out.println("listarNaoIndexados - indexando " + doc.getCodigo());
                        indexar(doc);
                    } else {
                        System.out.println("listarNaoIndexados - nao indexar " + doc.getCodigo());
                    }
                }
            }
            System.out.println("listarNaoIndexados - " + firstResult + " varridos");
            getSessao().clear();
        } while (list.size() > 0);
        System.out.println(
                "listarNaoIndexados - FIM    " + (System.currentTimeMillis() - tempoIni) / 3600000 + " minutos");
    }

    public void indexarFila(String path) throws Exception {
        String _path = path;
        if (_path == null)
            _path = SigaExProperties.getString("siga.lucene.index.path") + "/siga-ex-lucene-index-fila";
        File dir = new File(_path);
        ExDocumento doc = null;
        List<ExDocumento> listaDocs = new ArrayList<ExDocumento>();

        File[] children = dir.listFiles();
        if (children == null) {
            // Either dir does not exist or is not a directory
        } else {
            for (int i = 0; i < children.length; i++) {
                String filename = children[i].getName();

                try {
                    doc = consultar(Long.valueOf(filename), ExDocumento.class, false);
                    listaDocs.add(doc);
                    children[i].delete();
                } catch (Throwable e) {
                    e.printStackTrace();
                }
            }
            reindexarVarios(listaDocs, false);
        }
    }

    public void indexarTudo() throws Exception {
        indexarTudo(null);
        return;
    }

    public void indexarTudo(Aguarde aguarde) throws Exception {

        System.out.println("Indexando documentos...");
        long inicio = new Date().getTime();

        try {
            FullTextSession fullTextSession = Search.getFullTextSession(getSessao());
            Transaction deleteTx = fullTextSession.beginTransaction();
            fullTextSession.purgeAll(ExDocumento.class);
            deleteTx.commit();
            fullTextSession.clear();
            getSessao().clear();
        } catch (Throwable t) {
            // No havia documentos a excluir
        }

        final Criteria crit = getSessao().createCriteria(ExDocumento.class);

        int index = 0;

        FullTextSession fullTextSession = Search.getFullTextSession(getSessao());
        fullTextSession.setFlushMode(FlushMode.MANUAL);
        fullTextSession.setCacheMode(CacheMode.IGNORE);
        crit.setMaxResults(30);
        crit.addOrder(Order.desc("idDoc"));
        List<ExDocumento> list;
        do {
            crit.setFirstResult(index);
            list = crit.list();
            Transaction tx = fullTextSession.beginTransaction();
            for (ExDocumento doc : list) {
                index++;
                // if (aguarde != null)
                // aguarde.setMensagem(String.valueOf(index)
                // + " documentos j indexados.");
                if (doc.isIndexavel())
                    fullTextSession.index(doc);

                if (index % 100 == 0) {
                    //System.gc();
                    // fullTextSession.flush();
                    // fullTextSession.clear();
                }
            }
            tx.commit();
            fullTextSession.clear();
            getSessao().clear();
            System.out.print(String.valueOf(index) + " documentos j indexados. --  -- ");
        } while (list.size() > 0);
        //System.gc();

        // fullTextSession.close();
        System.out.println("Durao da indexao de documentos: " + (new Date().getTime() - inicio));

        if (aguarde != null)
            aguarde.setMensagem(String.valueOf(index));

    }

    public void indexarUltimas(int desde) throws Exception {

        System.out.println("Indexando documentos...");
        long inicio = new Date().getTime();

        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MINUTE, desde);
        Date dtIni = cal.getTime();

        Criteria crit = getSessao().createCriteria(ExDocumento.class);
        crit.createCriteria("exMovimentacaoSet").add(Restrictions.gt("dtIniMov", dtIni));
        crit.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

        /*
         * Query indexQuery = getSessao() .createQuery( "from ExDocumento as doc
         * inner join doc.exMovimentacaoSet as mov where mov.dtIniMov >=
         * :dtIni"); indexQuery.setParameter("dtIni", dtIni);
         */

        FullTextSession fullTextSession = Search.getFullTextSession(getSessao());
        // List<ExDocumento> list = indexQuery.list();
        List<ExDocumento> list = crit.list();
        Transaction tx = fullTextSession.beginTransaction();
        for (ExDocumento doc : list) {
            System.out.println(" . " + doc.getIdDoc());
            fullTextSession.purge(ExDocumento.class, doc);
            if (doc.isIndexavel())
                fullTextSession.index(doc);
        }
        tx.commit();
        fullTextSession.clear();
        getSessao().clear();
        //System.gc();

        // fullTextSession.close();
        System.out.println("Durao da indexao de documentos: " + (new Date().getTime() - inicio));

    }

    public List<ExDocumento> listarAgendados() {
        final Query query = getSessao().getNamedQuery("listarAgendados");
        return query.list();
    }

    public List<ExDocumento> consultarPorModeloParaPublicar(CpOrgaoUsuario orgaoUsu) {
        final Query query = getSessao().getNamedQuery("consultarPorModeloParaPublicarBI");
        query.setLong("idOrgaoUsu", orgaoUsu.getIdOrgaoUsu());
        return query.list();
    }

    public List<ExDocumento> consultarPorBoletimParaPublicar(ExDocumento doc) {
        final Query query = getSessao().getNamedQuery("consultarPorBoletimParaPublicarBI");

        query.setLong("idDoc", doc.getIdDoc());
        return query.list();
    }

    public ExBoletimDoc consultarBoletimPorDocumento(ExDocumento doc) {
        final Query query = getSessao().getNamedQuery("consultarBoletimPorDocumento");

        query.setLong("idDoc", doc.getIdDoc());

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

        return l.get(0);
    }

    public List<ExBoletimDoc> consultarBoletimPorBoletim(ExDocumento doc) {
        final Query query = getSessao().getNamedQuery("consultarBoletimPorBoletim");

        query.setLong("idDoc", doc.getIdDoc());

        return query.list();
    }

    public List<ExEmailNotificacao> consultarEmailNotificacao(DpPessoa pess, DpLotacao lot) {
        final Query query;

        if (pess != null) {
            query = getSessao().getNamedQuery("consultarEmailporPessoa");
            query.setLong("idPessoaIni", pess.getIdPessoaIni());
        } else {
            query = getSessao().getNamedQuery("consultarEmailporLotacao");

            query.setLong("idLotacaoIni", lot.getIdLotacaoIni());
        }

        return query.list();
    }

    public void indexar(ExDocumento entidade) {
        FullTextSession fullTextSession = Search.getFullTextSession(getSessao());
        Transaction tx = fullTextSession.beginTransaction();
        fullTextSession.index(entidade);
        tx.commit();
    }

    public void desindexar(ExDocumento entidade) {
        FullTextSession fullTextSession = Search.getFullTextSession(getSessao());
        try {
            Transaction tx = fullTextSession.beginTransaction();
            fullTextSession.purge(ExDocumento.class, entidade.getIdDoc());
            tx.commit();
        } catch (Throwable t) {
            // No havia aquela movimentao no ndice
        }
    }

    public List consultarPorResponsavel(final DpPessoa o, final DpLotacao lot) throws SQLException {
        try {
            final String s = " SELECT ID, DESCR, ORDEM, SUM(C1) C1, SUM(C2) C2 FROM ( " +
            // " -- pes " +
                    " SELECT EST.ID_ESTADO_DOC ID, EST.DESC_ESTADO_DOC DESCR,  EST.ORDEM_ESTADO_DOC ORDEM, COUNT(1) C1, 0 C2 "
                    + " FROM EX_ESTADO_DOC EST, DP_PESSOA_SIN PES, EX_MOVIMENTACAO MOVR " + " WHERE "
                    + " ID_PESSOA_INICIAL = ? " + " AND MOVR.DT_FIM_MOV IS NULL " + " AND NOT MOVR.NUM_VIA IS NULL "
                    + " AND NOT MOVR.NUM_VIA = 0 " + " AND MOVR.ID_ESTADO_DOC =  EST.ID_ESTADO_DOC "
                    + " AND MOVR.ID_RESP = PES.ID_PESSOA "
                    + " AND EST.ID_ESTADO_DOC <> 9 AND EST.ID_ESTADO_DOC <> 10 AND EST.ID_ESTADO_DOC <> 11 AND EST.ID_ESTADO_DOC <> 6 AND EST.ID_ESTADO_DOC <> 8 AND EST.ID_ESTADO_DOC <> 12 AND EST.ID_ESTADO_DOC <> 13 "
                    + " GROUP BY EST.ID_ESTADO_DOC, EST.DESC_ESTADO_DOC,  EST.ORDEM_ESTADO_DOC " + " " + " UNION "
                    + " SELECT EST.ID_ESTADO_DOC ID, EST.DESC_ESTADO_DOC DESCR,  EST.ORDEM_ESTADO_DOC ORDEM, COUNT(1) C1, 0 C2 "
                    + " FROM EX_ESTADO_DOC EST, DP_PESSOA_SIN PES, EX_MOVIMENTACAO MOVR " + " WHERE "
                    + " ID_PESSOA_INICIAL = ? " + " AND MOVR.DT_FIM_MOV IS NULL " + " AND NOT MOVR.NUM_VIA IS NULL "
                    + " AND NOT MOVR.NUM_VIA = 0 " + " AND MOVR.ID_ESTADO_DOC =  EST.ID_ESTADO_DOC "
                    + " AND MOVR.ID_ESTADO_DOC = 11 AND MOVR.ID_CADASTRANTE = PES.ID_PESSOA "
                    + " GROUP BY EST.ID_ESTADO_DOC, EST.DESC_ESTADO_DOC,  EST.ORDEM_ESTADO_DOC " + " " + " UNION "
                    + " SELECT EST.ID_ESTADO_DOC ID, EST.DESC_ESTADO_DOC DESCR,  EST.ORDEM_ESTADO_DOC ORDEM, COUNT(1) C1, 0 C2 "
                    + " FROM EX_ESTADO_DOC EST, DP_PESSOA_SIN PES, EX_DOCUMENTO DOCR " + " WHERE "
                    + " ID_PESSOA_INICIAL = ? " + " AND DOCR.ID_CADASTRANTE = PES.ID_PESSOA "
                    + " AND DOCR.DT_FINALIZACAO IS NULL " + " AND EST.ID_ESTADO_DOC = 1 "
                    + " GROUP BY EST.ID_ESTADO_DOC, EST.DESC_ESTADO_DOC,  EST.ORDEM_ESTADO_DOC " + " " + " UNION "
                    + " SELECT -1 ID, 'Em Trnsito' DESCR, 3, COUNT(1) C1, 0 C2 "
                    + " FROM EX_ESTADO_DOC EST, DP_PESSOA_SIN PES, EX_MOVIMENTACAO MOVR " + " WHERE "
                    + " ID_PESSOA_INICIAL = ? " + " AND MOVR.DT_FIM_MOV IS NULL " + " AND NOT MOVR.NUM_VIA IS NULL "
                    + " AND NOT MOVR.NUM_VIA = 0 " + " AND MOVR.ID_ESTADO_DOC =  EST.ID_ESTADO_DOC "
                    + " AND (MOVR.ID_SUBSCRITOR = PES.ID_PESSOA) " + " AND EST.ID_ESTADO_DOC = 3 "
                    + " GROUP BY EST.ID_ESTADO_DOC, EST.DESC_ESTADO_DOC,  EST.ORDEM_ESTADO_DOC " + " " + " UNION "
                    + " SELECT -3 ID, 'Em Trnsito Eletrnico' DESCR, 4, COUNT(1) C1, 0 C2 "
                    + " FROM EX_ESTADO_DOC EST, DP_PESSOA_SIN PES, EX_MOVIMENTACAO MOVR, EX_DOCUMENTO DOC "
                    + " WHERE " + " ID_PESSOA_INICIAL = ? " + " AND MOVR.DT_FIM_MOV IS NULL "
                    + " AND NOT MOVR.NUM_VIA IS NULL " + " AND NOT MOVR.NUM_VIA = 0 "
                    + " AND MOVR.ID_ESTADO_DOC =  EST.ID_ESTADO_DOC " + " AND (MOVR.ID_SUBSCRITOR = PES.ID_PESSOA) "
                    + " AND EST.ID_ESTADO_DOC = 3 " + " AND DOC.FG_ELETRONICO = 'S' "
                    + " AND MOVR.ID_DOC = DOC.ID_DOC "
                    + " GROUP BY EST.ID_ESTADO_DOC, EST.DESC_ESTADO_DOC,  EST.ORDEM_ESTADO_DOC " + " " +
                    // " -- lot " +
                    " UNION "
                    + " SELECT EST.ID_ESTADO_DOC ID, EST.DESC_ESTADO_DOC DESCR,  EST.ORDEM_ESTADO_DOC ORDEM, 0 C1, COUNT(1) C2 "
                    + " FROM EX_ESTADO_DOC EST, DP_LOTACAO_SIN LOT, EX_MOVIMENTACAO MOVR " + " WHERE "
                    + " ID_LOTACAO_INI = ? " + " AND MOVR.DT_FIM_MOV IS NULL " + " AND NOT MOVR.NUM_VIA IS NULL "
                    + " AND NOT MOVR.NUM_VIA = 0 " + " AND MOVR.ID_ESTADO_DOC =  EST.ID_ESTADO_DOC "
                    + " AND MOVR.ID_LOTA_RESP = LOT.ID_LOTACAO "
                    + " AND EST.ID_ESTADO_DOC <> 9 AND EST.ID_ESTADO_DOC <> 10 AND EST.ID_ESTADO_DOC <> 11 AND EST.ID_ESTADO_DOC <> 6 AND EST.ID_ESTADO_DOC <> 8 AND EST.ID_ESTADO_DOC <> 12 AND EST.ID_ESTADO_DOC <> 13 "
                    + " GROUP BY EST.ID_ESTADO_DOC, EST.DESC_ESTADO_DOC,  EST.ORDEM_ESTADO_DOC " + " " + " UNION "
                    + " SELECT EST.ID_ESTADO_DOC ID, EST.DESC_ESTADO_DOC DESCR,  EST.ORDEM_ESTADO_DOC ORDEM, 0 C1, COUNT(1) C2 "
                    + " FROM EX_ESTADO_DOC EST, DP_LOTACAO_SIN LOT, EX_MOVIMENTACAO MOVR " + " WHERE "
                    + " ID_LOTACAO_INI = ? " + " AND MOVR.DT_FIM_MOV IS NULL " + " AND NOT MOVR.NUM_VIA IS NULL "
                    + " AND NOT MOVR.NUM_VIA = 0 " + " AND MOVR.ID_ESTADO_DOC =  EST.ID_ESTADO_DOC "
                    + " AND MOVR.ID_ESTADO_DOC = 11 AND MOVR.ID_LOTA_CADASTRANTE = LOT.ID_LOTACAO "
                    + " AND EST.ID_ESTADO_DOC <> 9 AND EST.ID_ESTADO_DOC <> 10 AND EST.ID_ESTADO_DOC <> 11 AND EST.ID_ESTADO_DOC <> 6 AND EST.ID_ESTADO_DOC <> 8 AND EST.ID_ESTADO_DOC <> 12 AND EST.ID_ESTADO_DOC <> 13 "
                    + " GROUP BY EST.ID_ESTADO_DOC, EST.DESC_ESTADO_DOC,  EST.ORDEM_ESTADO_DOC " + " " + " UNION "
                    + " SELECT EST.ID_ESTADO_DOC ID, EST.DESC_ESTADO_DOC DESCR,  EST.ORDEM_ESTADO_DOC ORDEM, 0 C1, COUNT(1) C2 "
                    + " FROM EX_ESTADO_DOC EST, DP_LOTACAO_SIN LOT, EX_DOCUMENTO DOCR " + " WHERE "
                    + " ID_LOTACAO_INI = ? " + " AND DOCR.ID_LOTA_CADASTRANTE = LOT.ID_LOTACAO "
                    + " AND DOCR.DT_FINALIZACAO IS NULL " + " AND EST.ID_ESTADO_DOC = 1 "
                    + " GROUP BY EST.ID_ESTADO_DOC, EST.DESC_ESTADO_DOC,  EST.ORDEM_ESTADO_DOC " + " " + " UNION "
                    + " SELECT -1 ID, 'Em Trnsito' DESCR, 3, 0 C1, COUNT(1) C2 "
                    + " FROM EX_ESTADO_DOC EST, DP_LOTACAO_SIN LOT, EX_MOVIMENTACAO MOVR " + " WHERE "
                    + " ID_LOTACAO_INI = ? " + " AND MOVR.DT_FIM_MOV IS NULL " + " AND NOT MOVR.NUM_VIA IS NULL "
                    + " AND NOT MOVR.NUM_VIA = 0 " + " AND MOVR.ID_ESTADO_DOC =  EST.ID_ESTADO_DOC "
                    + " AND (MOVR.ID_LOTA_SUBSCRITOR = LOT.ID_LOTACAO) " + " AND EST.ID_ESTADO_DOC = 3 "
                    + " GROUP BY EST.ID_ESTADO_DOC, EST.DESC_ESTADO_DOC,  EST.ORDEM_ESTADO_DOC " + " " + " UNION "
                    + " SELECT -3 ID, 'Em Trnsito Eletrnico' DESCR, 4, 0 C1, COUNT(1) C2 "
                    + " FROM EX_ESTADO_DOC EST, DP_LOTACAO_SIN LOT, EX_MOVIMENTACAO MOVR, EX_DOCUMENTO DOC "
                    + " WHERE " + " ID_LOTACAO_INI = ? " + " AND MOVR.DT_FIM_MOV IS NULL "
                    + " AND NOT MOVR.NUM_VIA IS NULL " + " AND NOT MOVR.NUM_VIA = 0 "
                    + " AND MOVR.ID_ESTADO_DOC =  EST.ID_ESTADO_DOC "
                    + " AND (MOVR.ID_LOTA_SUBSCRITOR = LOT.ID_LOTACAO) " + " AND EST.ID_ESTADO_DOC = 3 "
                    + " AND DOC.FG_ELETRONICO = 'S' " + " AND MOVR.ID_DOC = DOC.ID_DOC "
                    + " GROUP BY EST.ID_ESTADO_DOC, EST.DESC_ESTADO_DOC,  EST.ORDEM_ESTADO_DOC " + " "
                    + " ) GROUP BY ID, DESCR, ORDEM ORDER BY ORDEM";

            final List result = new ArrayList<Object[]>();
            getSessao().doWork(new Work() {
                @Override
                public void execute(Connection conn) throws SQLException {
                    PreparedStatement psBlob = conn.prepareStatement(s);
                    ResultSet rset = null;

                    try {
                        psBlob.setLong(1, o.getIdPessoaIni());
                        psBlob.setLong(2, o.getIdPessoaIni());
                        psBlob.setLong(3, o.getIdPessoaIni());
                        psBlob.setLong(4, o.getIdPessoaIni());
                        psBlob.setLong(5, o.getIdPessoaIni());
                        psBlob.setLong(6, lot.getIdLotacaoIni());
                        psBlob.setLong(7, lot.getIdLotacaoIni());
                        psBlob.setLong(8, lot.getIdLotacaoIni());
                        psBlob.setLong(9, lot.getIdLotacaoIni());
                        psBlob.setLong(10, lot.getIdLotacaoIni());

                        final String j = psBlob.toString();
                        rset = psBlob.executeQuery();

                        while (rset.next()) {
                            final Object[] ao = new Object[4];
                            ao[0] = rset.getObject(1);
                            ao[1] = rset.getObject(2);
                            ao[2] = rset.getObject(4);
                            ao[3] = rset.getObject(5);
                            result.add(ao);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally {
                        if (!psBlob.isClosed())
                            psBlob.close();
                        if (!rset.isClosed())
                            rset.close();
                    }
                }
            });

            return result;

            /*
             * final Query query = getSessao().getNamedQuery(
             * "consultarPorResponsavelSQL"); query.setLong("pessoa",
             * o.getIdPessoaIni()); query.setLong("lotacao",
             * o.getLotacao().getIdLotacaoIni());
             * 
             * return query.list();
             */
        } catch (final NullPointerException e) {
            return null;
        }
    }

    /**
     * Le da tabela o campo do tipo BLOB e converte para um array de bytes.
     * mtodo no usa as facilidade do HIBERNATE em virtude da ausencia de
     * suporte para estes campos.
     */
    // public ExModelo consultarConteudoBlob(final ExModelo modelo)
    // throws SQLException {
    // final StringBuilder cmd = new StringBuilder(
    // "SELECT CONTEUDO_BLOB_MOD FROM EX_MODELO " + "WHERE ID_MOD= ? ");
    // final Connection conn = getSessao().connection();
    // final PreparedStatement psBlob = conn.prepareStatement(cmd.toString());
    // psBlob.setLong(1, modelo.getIdMod());
    // final ResultSet rset = psBlob.executeQuery();
    // rset.next();
    // final Blob blob = rset.getBlob("CONTEUDO_BLOB_MOD");
    // if (blob != null) {
    // final byte[] ba = blob.getBytes(1, (int) blob.length());
    // modelo.setConteudoBlobMod2(ba);
    // }
    // return modelo;
    // }

    public List consultarPaginaInicial(DpPessoa pes, DpLotacao lot, Integer idTipoForma) {
        try {
            SQLQuery sql = (SQLQuery) getSessao().getNamedQuery("consultarPaginaInicial");

            sql.setLong("idPessoaIni", pes.getIdPessoaIni());
            sql.setLong("idLotacaoIni", lot.getIdLotacaoIni());
            sql.setInteger("idTipoForma", idTipoForma);

            List result = sql.list();

            return result;

        } catch (final NullPointerException e) {
            return null;
        }
    }

    /**
     * Grava na tabela Ex_Modelo o conteudo do array de byte como um blob. O
     * mtodo no usa as facilidade do HIBERNATE em virtude da ausencia de
     * suporte para estes campos.
     * 
     * @param modelo
     *            - O objeto da Classe contendo um array de bytes para gravar.
     * @return O objeto aps a gravao
     * @throws SQLException
     * @throws AplicacaoException
     */
    // public void gravarConteudoBlob(final ExModelo modelo) throws
    // SQLException,
    // AplicacaoException {
    //
    // final StringBuilder upd = new StringBuilder("UPDATE  EX_MODELO "
    // + "SET CONTEUDO_BLOB_MOD = empty_blob() WHERE ID_MOD = ?");
    // final StringBuilder cmd = new StringBuilder(
    // "SELECT CONTEUDO_BLOB_MOD FROM EX_MODELO "
    // + "WHERE ID_MOD= ?  FOR UPDATE");
    // final Connection conn = getSessao().connection();
    // PreparedStatement psBlob = conn.prepareStatement(upd.toString());
    // psBlob.setLong(1, modelo.getIdMod());
    // final int i = psBlob.executeUpdate();
    // if (i < 1)
    // throw new AplicacaoException(
    // "Ocorreu ao inserir Blob em Documento " + "que no existe");
    // psBlob.close();
    // psBlob = conn.prepareStatement(cmd.toString());
    // psBlob.setLong(1, modelo.getIdMod());
    // final ResultSet rset = psBlob.executeQuery();
    // rset.next();
    // final Blob blob = rset.getBlob("CONTEUDO_BLOB_MOD");
    // final OutputStream blobOutputStream = blob.setBinaryStream(0);
    // try {
    // blobOutputStream.write(modelo.getConteudoBlobMod2());
    // blobOutputStream.close();
    // } catch (final IOException e) {
    // throw new AplicacaoException("Ocorreu um erro ao inserir o blob",
    // 0, e);
    // } finally {
    // psBlob.close();
    // }
    //
    // }

    public List<ExNivelAcesso> listarOrdemNivel() {
        Query query = getSessao().getNamedQuery("listarOrdemNivel");
        query.setCacheable(true);
        query.setCacheRegion("query.ExNivelAcesso");
        return query.list();
    }

    public void gravarPreenchimentoBlob(final ExPreenchimento exPreenchimento)
            throws SQLException, AplicacaoException {

        getSessao().flush();
        getSessao().doWork(new Work() {
            @Override
            public void execute(Connection conn) throws SQLException {
                if (exPreenchimento.getPreenchimentoBlob() == null) {
                    final StringBuilder upd = new StringBuilder("UPDATE  EX_PREENCHIMENTO "
                            + "SET PREENCHIMENTO_BLOB = NULL WHERE ID_PREENCHIMENTO = ?");
                    final PreparedStatement psBlob = conn.prepareStatement(upd.toString());
                    psBlob.setLong(1, exPreenchimento.getIdPreenchimento());
                    try {
                        final int i = psBlob.executeUpdate();
                        if (i < 1)
                            throw new AplicacaoException("Ocorreu ao apagar Blob");
                    } finally {
                        psBlob.close();
                    }
                } else {
                    final StringBuilder upd = new StringBuilder(
                            "UPDATE  EX_PREENCHIMENTO SET PREENCHIMENTO_BLOB = empty_blob() WHERE ID_PREENCHIMENTO = ?");
                    final StringBuilder cmd = new StringBuilder(
                            "SELECT PREENCHIMENTO_BLOB FROM ex_preenchimento WHERE ID_PREENCHIMENTO = ?  FOR UPDATE");
                    PreparedStatement psBlob = conn.prepareStatement(upd.toString());
                    psBlob.setLong(1, exPreenchimento.getIdPreenchimento());
                    final int i = psBlob.executeUpdate();
                    if (i < 1)
                        throw new AplicacaoException("Ocorreu ao inserir Blob");
                    psBlob.close();
                    psBlob = conn.prepareStatement(cmd.toString());
                    psBlob.setLong(1, exPreenchimento.getIdPreenchimento());
                    final ResultSet rset = psBlob.executeQuery();
                    boolean b = rset.next();
                    final Blob blob = rset.getBlob("PREENCHIMENTO_BLOB");
                    final OutputStream blobOutputStream = blob.setBinaryStream(0);
                    try {
                        blobOutputStream.write(exPreenchimento.getPreenchimentoBA());
                        blobOutputStream.close();
                    } catch (final IOException e) {
                        throw new AplicacaoException("Ocorreu um erro ao inserir o blob", 0, e);
                    } finally {
                        psBlob.close();
                    }
                }
            }
        });

    }

    public ExPreenchimento consultarPreenchimentoBlob(final ExPreenchimento exPreenchimento) throws SQLException {
        final StringBuilder cmd = new StringBuilder(
                "SELECT PREENCHIMENTO_BLOB FROM ex_preenchimento WHERE ID_PREENCHIMENTO= ? ");
        getSessao().doWork(new Work() {
            @Override
            public void execute(Connection conn) throws SQLException {
                final PreparedStatement psBlob = conn.prepareStatement(cmd.toString());
                psBlob.setLong(1, exPreenchimento.getIdPreenchimento());
                final ResultSet rset = psBlob.executeQuery();
                rset.next();
                final Blob blob = rset.getBlob("PREENCHIMENTO_BLOB");
                if (blob != null) {
                    final byte[] ba = blob.getBytes(1, (int) blob.length());
                    exPreenchimento.setPreenchimentoBA(ba);
                } else {
                    exPreenchimento.setPreenchimentoBlob(null);
                }
            }
        });

        return exPreenchimento;
    }

    public List<ExPreenchimento> consultar(ExPreenchimento exPreenchimento) {
        try {
            final Query query = getSessao().getNamedQuery("consultarPorFiltroExPreenchimento");
            if (exPreenchimento.getNomePreenchimento() != null)
                query.setString("nomePreenchimento",
                        exPreenchimento.getNomePreenchimento().toUpperCase().replace(' ', '%'));
            else
                query.setString("nomePreenchimento", "");
            if (exPreenchimento.getDpLotacao() != null)
                query.setLong("lotacao", exPreenchimento.getDpLotacao().getIdLotacao());
            else
                query.setLong("lotacao", 0);
            if (exPreenchimento.getExModelo() != null)
                query.setLong("modelo", exPreenchimento.getExModelo().getHisIdIni());
            else
                query.setLong("modelo", 0);
            final List<ExPreenchimento> l = query.list();
            return l;
        } catch (final NullPointerException e) {
            return null;
        }
    }

    /*
     * public void excluirPorId(Long id) throws SQLException, CsisException {
     * try { final Query query = getSessao().getNamedQuery(
     * "excluirPorIdExPreenchimento"); query.setLong("id", id);
     * query.executeUpdate(); } catch (final NullPointerException e) { throw e;
     * } }
     */

    public void alterar(final ExPreenchimento exPreenchimento) throws SQLException, AplicacaoException {
        getSessao().flush();
        getSessao().doWork(new Work() {
            @Override
            public void execute(Connection conn) throws SQLException {
                final StringBuilder upd = new StringBuilder("UPDATE  EX_PREENCHIMENTO "
                        + "SET PREENCHIMENTO_BLOB = empty_blob() WHERE ID_PREENCHIMENTO = ?");
                final StringBuilder cmd = new StringBuilder("SELECT PREENCHIMENTO_BLOB FROM ex_preenchimento "
                        + "WHERE ID_PREENCHIMENTO = ?  FOR UPDATE");
                PreparedStatement psBlob = conn.prepareStatement(upd.toString());
                psBlob.setLong(1, exPreenchimento.getIdPreenchimento());
                final int i = psBlob.executeUpdate();
                if (i < 1)
                    throw new AplicacaoException("Ocorreu ao inserir Blob");
                psBlob.close();
                psBlob = conn.prepareStatement(cmd.toString());
                psBlob.setLong(1, exPreenchimento.getIdPreenchimento());
                final ResultSet rset = psBlob.executeQuery();
                boolean b = rset.next();
                final Blob blob = rset.getBlob("PREENCHIMENTO_BLOB");
                final OutputStream blobOutputStream = blob.setBinaryStream(0);
                try {
                    blobOutputStream.write(exPreenchimento.getPreenchimentoBA());
                    blobOutputStream.close();
                } catch (final IOException e) {
                    throw new AplicacaoException("Ocorreu um erro ao inserir o blob", 0, e);
                } finally {
                    psBlob.close();
                }
            }
        });

    }

    public List consultarAtivos() {
        final Query query = getSessao().getNamedQuery("consultarAtivos");
        return query.list();
    }

    public List<ExConfiguracao> consultar(final ExConfiguracao exemplo) {
        CpTipoConfiguracao tpConf = exemplo.getCpTipoConfiguracao();
        CpOrgaoUsuario orgao = exemplo.getOrgaoUsuario();

        StringBuffer sbf = new StringBuffer();

        sbf.append("select * from siga.ex_configuracao ex inner join " + Catalogs.CORPORATIVO
                + ".cp_configuracao cp on ex.id_configuracao_ex = cp.id_configuracao ");

        sbf.append("" + "where 1 = 1");

        if (tpConf != null && tpConf.getIdTpConfiguracao() != null && tpConf.getIdTpConfiguracao() != 0) {
            sbf.append(" and cp.id_tp_configuracao = ");
            sbf.append(exemplo.getCpTipoConfiguracao().getIdTpConfiguracao());
        }

        if (exemplo.getExTipoMovimentacao() != null && exemplo.getExTipoMovimentacao().getIdTpMov() != null
                && exemplo.getExTipoMovimentacao().getIdTpMov() != 0) {
            sbf.append(" and ex.id_tp_mov = ");
            sbf.append(exemplo.getExTipoMovimentacao().getIdTpMov());
        }

        if (exemplo.getExFormaDocumento() != null && exemplo.getExFormaDocumento().getIdFormaDoc() != null) {
            sbf.append(" and (ex.id_forma_doc = ");
            sbf.append(exemplo.getExFormaDocumento().getIdFormaDoc());
            sbf.append(" or (ex.id_mod is null and ex.id_forma_doc is null and ex.id_tp_forma_doc is null)");
            sbf.append(" or (ex.id_forma_doc is null and ex.id_tp_forma_doc = ");
            sbf.append(exemplo.getExFormaDocumento().getExTipoFormaDoc().getId());
            sbf.append(" ))");
        }

        if (exemplo.getExModelo() != null && exemplo.getExModelo().getIdMod() != null
                && exemplo.getExModelo().getIdMod() != 0) {
            sbf.append(" and (ex.id_mod = ");
            sbf.append(exemplo.getExModelo().getIdMod());
            sbf.append(" or (ex.id_mod is null and ex.id_forma_doc is null and ex.id_tp_forma_doc is null)");
            sbf.append(" or (ex.id_mod is null and ex.id_forma_doc = ");
            sbf.append(exemplo.getExModelo().getExFormaDocumento().getId());
            sbf.append(")");
            sbf.append(" or (ex.id_mod is null and ex.id_forma_doc is null and ex.id_tp_forma_doc = ");
            sbf.append(exemplo.getExModelo().getExFormaDocumento().getExTipoFormaDoc().getId());
            sbf.append(" ))");
        }

        if (orgao != null && orgao.getId() != null && orgao.getId() != 0) {
            sbf.append(" and (cp.id_orgao_usu = ");
            sbf.append(orgao.getId());
            sbf.append(" or cp.id_lotacao in (select id_lotacao from " + Catalogs.CORPORATIVO
                    + ".dp_lotacao lot where lot.id_orgao_usu= ");
            sbf.append(orgao.getId());
            sbf.append(")");
            sbf.append(" or cp.id_pessoa in (select id_pessoa from " + Catalogs.CORPORATIVO
                    + ".dp_pessoa pes where pes.id_orgao_usu = ");
            sbf.append(orgao.getId());
            sbf.append(")");
            sbf.append(" or cp.id_cargo in (select id_cargo from " + Catalogs.CORPORATIVO
                    + ".dp_cargo cr where cr.id_orgao_usu = ");
            sbf.append(orgao.getId());
            sbf.append(")");
            sbf.append(" or cp.id_funcao_confianca in (select id_funcao_confianca from " + Catalogs.CORPORATIVO
                    + ".dp_funcao_confianca fc where fc.id_orgao_usu = ");
            sbf.append(orgao.getId());
            sbf.append(")");
            sbf.append(
                    " or (cp.id_orgao_usu is null and cp.id_lotacao is null and cp.id_pessoa is null and cp.id_cargo is null and cp.id_funcao_confianca is null");
            sbf.append(")");
            sbf.append(")");
            sbf.append("order by ex.id_configuracao_ex");

        }

        Query query = getSessao().createSQLQuery(sbf.toString()).addEntity(ExConfiguracao.class);

        query.setCacheable(true);
        query.setCacheRegion("query.ExConfiguracao");
        return query.list();

    }

    public List<ExClassificacao> listarExClassificacaoPorNivel(String mascara, String exceto) {
        Query q = getSessao().getNamedQuery("consultarExClassificacaoComExcecao");
        q.setString("mascara", mascara);
        q.setString("exceto", exceto);
        return q.list();

    }

    public List<ExClassificacao> listarExClassificacaoPorNivel(String mascara) {
        Query q = getSessao().getNamedQuery("consultarExClassificacaoPorMascara");
        q.setString("mascara", mascara);
        q.setString("descrClassificacao", "");
        return q.list();

    }

    public List<ExClassificacao> consultarPorFiltro(final ExClassificacaoDaoFiltro flt) {
        return consultarPorFiltro(flt, 0, 0);
    }

    public List<ExClassificacao> consultarPorFiltro(final ExClassificacaoDaoFiltro flt, final int offset,
            final int itemPagina) {
        String descrClassificacao = "";

        MascaraUtil m = MascaraUtil.getInstance();

        if (flt.getDescricao() != null) {
            String d = flt.getDescricao();
            if (d.length() > 0 && m.isCodificacao(d)) {
                descrClassificacao = m.formatar(d);
            } else {
                descrClassificacao = d;
            }
        }

        final Query query = getSessao().getNamedQuery("consultarPorFiltroExClassificacao");
        if (offset > 0) {
            query.setFirstResult(offset);
        }
        if (itemPagina > 0) {
            query.setMaxResults(itemPagina);
        }

        if (flt.getSigla() == null || flt.getSigla().equals("")) {
            query.setString("mascara", MascaraUtil.getInstance().getMscTodosDoMaiorNivel());
        } else {
            query.setString("mascara", MascaraUtil.getInstance().getMscFilho(flt.getSigla().toString(), true));
        }

        query.setString("descrClassificacao", descrClassificacao.toUpperCase().replace(' ', '%'));
        query.setString("descrClassificacaoSemAcento",
                Texto.removeAcentoMaiusculas(descrClassificacao).replace(' ', '%'));

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

    public int consultarQuantidade(final ExClassificacaoDaoFiltro flt) {
        String descrClassificacao = "";
        if (flt.getDescricao() != null) {
            descrClassificacao = flt.getDescricao();
        }

        final Query query = getSessao().getNamedQuery("consultarQuantidadeExClassificacao");

        query.setString("descrClassificacao", descrClassificacao.toUpperCase().replace(' ', '%'));
        query.setString("mascara", MascaraUtil.getInstance().getMscTodosDoMaiorNivel());

        final int l = ((Long) query.uniqueResult()).intValue();
        return l;
    }

    public ExClassificacao consultarPorSigla(final ExClassificacao o) {
        try {
            final Query query = getSessao().getNamedQuery("consultarPorSiglaExClassificacao");
            query.setString("codificacao", MascaraUtil.getInstance().formatar(o.getSigla()));

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

    public ExClassificacao consultarAtual(final ExClassificacao o) {
        try {
            final Query query = getSessao().getNamedQuery("consultarAtualPorId");
            query.setLong("idRegIni", o.getHisIdIni());
            return (ExClassificacao) query.uniqueResult();
        } catch (final NullPointerException e) {
            return null;
        }
    }

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

    public List consultarMovimentacoesPorLotacaoEntreDatas(// DpPessoa titular,
            DpLotacao lotaTitular, Date dtIni, Date dtFim) {
        try {
            final Query query = getSessao().getNamedQuery("consultarMovimentacoesPorLotacaoEntreDatas");
            if (lotaTitular.getIdLotacaoIni() != null)
                query.setLong("lotaTitular", lotaTitular.getIdLotacaoIni());
            else
                query.setLong("lotaTitular", 0);

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

    public ExTpDocPublicacao consultarPorModelo(ExModelo mod) {
        try {
            final Query query = getSessao().getNamedQuery("consultarPorModelo");
            query.setLong("idMod", mod.getHisIdIni());

            return (ExTpDocPublicacao) query.list().get(0);
        } catch (final Throwable t) {
            // engolindo a exceo. Melhorar isso.
            return null;
        }
    }

    public List<ExDocumento> listarSolicitados(CpOrgaoUsuario orgaoUsu) {
        final Query query = getSessao().getNamedQuery("listarSolicitados");
        query.setLong("idOrgaoUsu", orgaoUsu.getIdOrgaoUsu());
        return query.list();
    }

    public List<ExMobil> consultarParaArquivarCorrenteEmLote(DpLotacao lot) {
        final Query query = getSessao().getNamedQuery(

                "consultarParaArquivarCorrenteEmLote");
        query.setLong("lotaIni", lot.getIdLotacaoIni());
        return query.list();
    }

    public List<ExItemDestinacao> consultarParaArquivarIntermediarioEmLote(DpLotacao lot, int offset) {
        final Query query = getSessao().getNamedQuery("consultarParaArquivarIntermediarioEmLote");
        query.setLong("idOrgaoUsu", lot.getOrgaoUsuario().getIdOrgaoUsu());
        query.setFirstResult(offset);
        query.setMaxResults(100);
        List<Object[]> results = query.list();
        List<ExItemDestinacao> listaFinal = new ArrayList<ExItemDestinacao>();
        for (Object[] result : results) {
            listaFinal.add(new ExItemDestinacao(result));
        }
        return listaFinal;
    }

    public int consultarQuantidadeParaArquivarIntermediarioEmLote(DpLotacao lot) {
        final Query query = getSessao().getNamedQuery("consultarQuantidadeParaArquivarIntermediarioEmLote");
        query.setLong("idOrgaoUsu", lot.getOrgaoUsuario().getIdOrgaoUsu());
        return ((Long) query.uniqueResult()).intValue();
    }

    public List<ExItemDestinacao> consultarParaArquivarPermanenteEmLote(DpLotacao lot, int offset) {
        final Query query = getSessao().getNamedQuery("consultarParaArquivarPermanenteEmLote");
        query.setLong("idOrgaoUsu", lot.getOrgaoUsuario().getIdOrgaoUsu());
        query.setFirstResult(offset);
        query.setMaxResults(100);
        List<Object[]> results = query.list();
        List<ExItemDestinacao> listaFinal = new ArrayList<ExItemDestinacao>();
        for (Object[] result : results) {
            listaFinal.add(new ExItemDestinacao(result));
        }
        return listaFinal;
    }

    public int consultarQuantidadeParaArquivarPermanenteEmLote(DpLotacao lot) {
        final Query query = getSessao().getNamedQuery("consultarQuantidadeParaArquivarPermanenteEmLote");
        query.setLong("idOrgaoUsu", lot.getOrgaoUsuario().getIdOrgaoUsu());
        return ((Long) query.uniqueResult()).intValue();
    }

    //public Query consultarParaTransferirEmLote(DpLotacao lot) {
    @SuppressWarnings("unchecked")
    public Iterator<ExMobil> consultarParaTransferirEmLote(DpLotacao lot) {
        final Query query = getSessao().getNamedQuery("consultarParaTransferirEmLote");
        query.setLong("lotaIni", lot.getIdLotacaoIni());
        //return query;
        return query.iterate();
    }

    public List<ExMobil> consultarParaAnotarEmLote(DpLotacao lot) {
        final Query query = getSessao().getNamedQuery("consultarParaAnotarEmLote");
        query.setLong("lotaIni", lot.getIdLotacaoIni());
        return query.list();
    }

    public List<ExItemDestinacao> consultarAEliminar(CpOrgaoUsuario orgaoUsu, Date dtIni, Date dtFim) {
        final Query query = getSessao().getNamedQuery("consultarAEliminar");
        query.setLong("idOrgaoUsu", orgaoUsu.getIdOrgaoUsu());
        query.setDate("dtIni", dtIni);
        query.setDate("dtFim", dtFim);
        long ini = System.currentTimeMillis();
        List<Object[]> results = query.list();
        List<ExItemDestinacao> listaFinal = new ArrayList<ExItemDestinacao>();
        for (Object[] result : results) {
            listaFinal.add(new ExItemDestinacao(result));
        }
        long fim = System.currentTimeMillis() - ini;
        return listaFinal;
    }

    public int consultarQuantidadeAEliminar(CpOrgaoUsuario orgaoUsu, Date dtIni, Date dtFim) {
        final Query query = getSessao().getNamedQuery("consultarQuantidadeAEliminar");
        query.setLong("idOrgaoUsu", orgaoUsu.getIdOrgaoUsu());
        query.setDate("dtIni", dtIni);
        query.setDate("dtFim", dtFim);
        return ((Long) query.uniqueResult()).intValue();
    }

    public List<ExItemDestinacao> consultarEmEditalEliminacao(CpOrgaoUsuario orgaoUsu, Date dtIni, Date dtFim) {
        final Query query = getSessao().getNamedQuery("consultarEmEditalEliminacao");
        query.setLong("idOrgaoUsu", orgaoUsu.getIdOrgaoUsu());
        query.setDate("dtIni", dtIni);
        query.setDate("dtFim", dtFim);
        List<Object[]> results = query.list();
        List<ExItemDestinacao> listaFinal = new ArrayList<ExItemDestinacao>();
        for (Object[] result : results) {
            listaFinal.add(new ExItemDestinacao(result));
        }
        return listaFinal;
    }

    public ExFormaDocumento consultarPorSigla(ExFormaDocumento o) {
        final Query query = getSessao().getNamedQuery("consultarSiglaForma");
        query.setString("sigla", o.getSigla());

        query.setCacheable(true);
        query.setCacheRegion("query.ExFormaDocumento");

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

    public int obterProximoNumeroVolume(ExDocumento doc) {
        return doc.getNumUltimoVolume() + 1;
    }

    public int obterProximoNumeroSubdocumento(ExMobil mob) {
        return mob.getNumUltimoSubdocumento() + 1;
    }

    public List<ExMobil> consultarParaReceberEmLote(DpLotacao lot) {
        final Query query = getSessao().getNamedQuery("consultarParaReceberEmLote");
        query.setLong("lotaIni", lot.getIdLotacaoIni());
        return query.list();
    }

    public List<ExMobil> consultarParaViaDeProtocolo(DpLotacao lot) {
        final Query query = getSessao().getNamedQuery("consultarParaViaDeProtocolo");
        query.setLong("lotaIni", lot.getIdLotacaoIni());
        return query.list();
    }

    public List<ExMovimentacao> consultarMovimentacoes(DpPessoa pes, Date dt) {

        if (pes == null || dt == null) {
            log.error(
                    "[consultarMovimentacoes] - Os dados recebidos para realizar a consulta de movimentaes no podem ser nulos.");
            throw new IllegalStateException("A pessoa e/ou a data informada para a realizao da consulta  nula.");
        }

        final SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        final Query query = getSessao().getNamedQuery("consultarMovimentacoes");
        ExMovimentacao mov = consultar(1122650L, ExMovimentacao.class, false);

        query.setLong("pessoaIni", pes.getIdPessoaIni());
        // query.setDate("data", dt);
        query.setString("data", df.format(dt));
        return query.list();
    }

    public Date getServerDateTime() {
        return null;
    }

    public List<ExModelo> listarTodosModelosOrdenarPorNome(String script) {
        final Query q = getSessao()
                .createQuery("select m from ExModelo m left join m.exFormaDocumento as f where m.hisAtivo = 1"
                        + "order by f.descrFormaDoc, m.nmMod");
        List<ExModelo> l = new ArrayList<ExModelo>();
        for (ExModelo mod : (List<ExModelo>) q.list()) {
            if (script != null && script.trim().length() != 0) {
                if (mod.getConteudoBlobMod2() != null) {
                    String conteudo;
                    try {
                        conteudo = new String(mod.getConteudoBlobMod2(), "utf-8");
                    } catch (UnsupportedEncodingException e) {
                        conteudo = new String(mod.getConteudoBlobMod2());
                    }
                    if ("template/freemarker".equals(mod.getConteudoTpBlob()) && (conteudo.contains(script)))
                        l.add(mod);
                }
            } else
                l.add(mod);
        }
        return l;
    }

    static public Configuration criarHibernateCfg(String datasource) throws Exception {
        Configuration cfg = CpDao.criarHibernateCfg(datasource);
        ExDao.configurarHibernate(cfg);
        return cfg;
    }

    static public Configuration criarHibernateCfg(String connectionUrl, String username, String password)
            throws Exception {
        Configuration cfg = CpDao.criarHibernateCfg(connectionUrl, username, password);
        ExDao.configurarHibernate(cfg);
        return cfg;
    }

    static public Configuration criarHibernateCfg(CpAmbienteEnumBL ambiente) throws Exception {
        CpPropriedadeBL prop = Ex.getInstance().getProp();
        prop.setPrefixo("siga.ex." + ambiente.getSigla());
        Configuration cfg = CpDao.criarHibernateCfg(ambiente, prop);
        ExDao.configurarHibernate(cfg);
        return cfg;
    }

    static private void configurarHibernate(Configuration cfg) throws Exception {

        cfg.addClass(br.gov.jfrj.siga.ex.ExMobil.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExDocumento.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExFormaDocumento.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExConfiguracao.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExSituacaoConfiguracao.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExClassificacao.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExModelo.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExTemporalidade.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExTipoDespacho.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExTipoDestinacao.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExTipoDocumento.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExNivelAcesso.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExEstadoDoc.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExPreenchimento.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExTipoFormaDoc.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExTipoMovimentacao.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExVia.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExMovimentacao.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExTpDocPublicacao.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExTipoMobil.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExBoletimDoc.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExPapel.class);
        cfg.addClass(br.gov.jfrj.siga.ex.ExEmailNotificacao.class);
        cfg.addClass(br.gov.jfrj.siga.dp.CpTipoMarcador.class);
        cfg.addClass(br.gov.jfrj.siga.dp.CpMarcador.class);
        cfg.addClass(br.gov.jfrj.siga.dp.CpTipoMarca.class);

        cfg.addAnnotatedClass(br.gov.jfrj.siga.ex.ExMarca.class);
        cfg.addAnnotatedClass(br.gov.jfrj.siga.dp.CpMarca.class);

        // cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.ex.ExClassificacao",
        // "read-only", "ex");
        // cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.ex.ExConfiguracao",
        // "read-only", "ex");
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.ex.ExEstadoDoc", "read-only", CACHE_EX);
        //cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.ex.ExFormaDocumento",
        //   "read-only", CACHE_EX);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.ex.ExNivelAcesso", "read-only", CACHE_EX);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.ex.ExSituacaoConfiguracao", "read-only", CACHE_EX);
        // cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.ex.ExTemporalidade",
        // "read-only", "ex");
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.ex.ExTipoDespacho", "read-only", CACHE_EX);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.ex.ExTipoDestinacao", "read-only", CACHE_EX);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.ex.ExTipoDocumento", "read-only", CACHE_EX);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.ex.ExTpDocPublicacao", "read-only", CACHE_EX);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.ex.ExTipoMovimentacao", "read-only", CACHE_EX);
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.ex.ExTipoFormaDoc", "read-only", CACHE_EX);
        // cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.ex.ExVia",
        // "read-only", "ex");
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.ex.ExTipoMobil", "read-only", CACHE_EX);
        cfg.setCollectionCacheConcurrencyStrategy("br.gov.jfrj.siga.ex.ExTipoDocumento.exFormaDocumentoSet",
                "read-only", CACHE_EX);

        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.dp.CpTipoMarca", "nonstrict-read-write", "corporativo");
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.dp.CpTipoMarcador", "nonstrict-read-write",
                "corporativo");
        cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.dp.CpMarcador", "nonstrict-read-write", "corporativo");

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

        if (!manager.cacheExists(CACHE_EX)) {
            manager.addCache(CACHE_EX);
            cache = manager.getCache(CACHE_EX);
            config = cache.getCacheConfiguration();
            config.setTimeToIdleSeconds(3600);
            config.setTimeToLiveSeconds(36000);
            config.setMaxElementsInMemory(10000);
            config.setMaxElementsOnDisk(1000000);
        }

        // cfg.setCollectionCacheConcurrencyStrategy(
        // "br.gov.jfrj.siga.ex.ExClassificacao.exViaSet", "read-only",
        // "ex");
        // cfg.setCollectionCacheConcurrencyStrategy(
        // "br.gov.jfrj.siga.ex.ExFormaDocumento.exModeloSet",

        // "nonstrict-read-write", "ex");
        // cfg.setCacheConcurrencyStrategy("br.gov.jfrj.siga.ex.ExModelo",
        // "nonstrict-read-write", "ex");

        // Hibernate search configuration
        //
        if ("true".equals(SigaExProperties.getString("siga.lucene.ativo"))) {
            cfg.setProperty("hibernate.search.default.directory_provider",
                    "org.hibernate.search.store.FSDirectoryProvider");
            cfg.setProperty("hibernate.search.default.indexBase",
                    SigaExProperties.getString("siga.lucene.index.path") + "/siga-ex-lucene-index/");
            cfg.setProperty("hibernate.search.default.optimizer.operation_limit.max", "2000");
            cfg.setProperty("org.hibernate.worker.execution", "sync");
            cfg.setProperty("org.hibernate.worker.batch_size", "1000");
            cfg.setProperty("hibernate.search.indexing_strategy", "manual");
            //            cfg.getEventListeners()
            //            .setPostUpdateEventListeners(
            //                  new PostUpdateEventListener[] { (PostUpdateEventListener) ReflectHelper
            //                        .classForName(
            //                              "org.hibernate.search.event.FullTextIndexEventListener")
            //                              .newInstance() });
            //            cfg.getEventListeners()
            //            .setPostInsertEventListeners(
            //                  new PostInsertEventListener[] { (PostInsertEventListener) ReflectHelper
            //                        .classForName(
            //                              "org.hibernate.search.event.FullTextIndexEventListener")
            //                              .newInstance() });
            //            cfg.getEventListeners()
            //            .setPostDeleteEventListeners(
            //                  new PostDeleteEventListener[] { (PostDeleteEventListener) ReflectHelper
            //                        .classForName(
            //                              "org.hibernate.search.event.FullTextIndexEventListener")
            //                              .newInstance() });
        } else {
            cfg.setProperty("hibernate.search.autoregister_listeners", "false");
        }

    }

    public ExModelo consultarExModelo(String sForma, String sModelo) {
        final Criteria crit = getSessao().createCriteria(ExModelo.class);
        crit.add(Restrictions.eq("nmMod", sModelo));
        crit.add(Restrictions.eq("hisAtivo", 1));

        if (sForma != null) {
            crit.createAlias("exFormaDocumento", "f");
            crit.add(Restrictions.eq("f.descrFormaDoc", sForma));
        }
        return (ExModelo) crit.uniqueResult();
    }

    public ExTipoDocumento consultarExTipoDocumento(String descricao) {
        final Criteria crit = getSessao().createCriteria(ExTipoDocumento.class);
        crit.add(Restrictions.eq("descrTipoDocumento", descricao));

        return (ExTipoDocumento) crit.uniqueResult();
    }

    public ExNivelAcesso consultarExNidelAcesso(String nome) {
        final Criteria crit = getSessao().createCriteria(ExNivelAcesso.class);
        crit.add(Restrictions.eq("nmNivelAcesso", nome));

        return (ExNivelAcesso) crit.uniqueResult();
    }

    public ExModelo consultarModeloAtual(ExModelo mod) {
        final Query query = getSessao().getNamedQuery("consultarModeloAtual");

        query.setLong("hisIdIni", mod.getHisIdIni());
        return (ExModelo) query.uniqueResult();
    }

    public List<ExDocumento> listarDocPendenteAssinatura(DpPessoa pessoa) {
        final Query query = getSessao().getNamedQuery("listarDocPendenteAssinatura");
        query.setLong("idPessoaIni", pessoa.getIdPessoaIni());
        return query.list();
    }

    public List<ExMovimentacao> listarDespachoPendenteAssinatura(DpPessoa pessoa) {
        final Query query = getSessao().getNamedQuery("listarDespachoPendenteAssinatura");
        query.setLong("idPessoaIni", pessoa.getIdPessoaIni());
        return query.list();
    }

    public String consultarDescricaoExClassificacao(ExClassificacao exClass) {
        String[] pais = MascaraUtil.getInstance().getPais(exClass.getCodificacao());
        if (pais == null) {
            return exClass.getDescrClassificacao();
        }
        // pais = Arrays.copyOf(pais, pais.length+1);
        // pais[pais.length-1]= exClass.getCodificacao();

        Query q = getSessao().getNamedQuery("consultarDescricaoExClassificacao");
        q.setParameterList("listaCodificacao", pais);
        List<String> result = q.list();
        StringBuffer sb = new StringBuffer();
        for (String descr : result) {
            sb.append(descr);
            sb.append(": ");
        }

        sb.append(exClass.getDescrClassificacao());
        return sb.toString();
    }

    public List<ExClassificacao> consultarExClassificacaoVigente() {
        return consultarExClassificacao(MascaraUtil.getInstance().getMscTodosDoMaiorNivel(), "");
    }

    public List<ExClassificacao> consultarFilhos(ExClassificacao exClass, boolean niveisAbaixo) {
        final Query query = getSessao().getNamedQuery("consultarFilhosExClassificacao");
        query.setString("mascara",
                MascaraUtil.getInstance().getMscFilho(exClass.getCodificacao().toString(), niveisAbaixo));

        return query.list().subList(1, query.list().size());
    }

    public List<ExClassificacao> consultarExClassificacao(String mascaraLike, String descrClassificacao) {
        Query q = getSessao().getNamedQuery("consultarExClassificacaoPorMascara");
        q.setString("mascara", mascaraLike);
        q.setString("descrClassificacao", descrClassificacao.toUpperCase());

        return q.list();
    }

    public ExClassificacao consultarExClassificacao(String codificacao) {
        ExClassificacao flt = new ExClassificacao();
        flt.setSigla(codificacao);
        return ExDao.getInstance().consultarPorSigla(flt);
    }

    public List<ExDocumento> consultarExDocumentoPorClassificacao(DpLotacao lotacao, String mascara,
            CpOrgaoUsuario orgaoUsu) {
        Query q;
        if (lotacao == null) {
            q = getSessao().getNamedQuery("consultarExDocumentoClassificados");
        } else {
            q = getSessao().getNamedQuery("consultarExDocumentoClassificadosPorLotacao");
            q.setLong("idLotacao", lotacao.getId());
        }

        q.setString("mascara", mascara);
        q.setLong("idOrgaoUsuario", orgaoUsu.getIdOrgaoUsu());
        return q.list();
    }

    public List<ExPapel> listarExPapeis() {
        return findByCriteria(ExPapel.class);
    }

    public List<ExTpDocPublicacao> listarExTiposDocPublicacao() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, ExTpDocPublicacao.class);
    }

    public List<ExConfiguracao> listarExConfiguracoes() {
        return findByCriteria(ExConfiguracao.class);
    }

    public List<ExTipoDocumento> listarExTiposDocumento() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, ExTipoDocumento.class);
    }

    public List<ExEstadoDoc> listarExEstadosDoc() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, ExEstadoDoc.class);
    }

    public List<ExTipoDestinacao> listarExTiposDestinacao() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, ExTipoDestinacao.class);
    }

    public List<ExTipoFormaDoc> listarExTiposFormaDoc() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, ExTipoFormaDoc.class);
    }

    public List<ExTipoMovimentacao> listarExTiposMovimentacao() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, ExTipoMovimentacao.class);
    }

    public List<ExModelo> listarExModelos() {
        return findByCriteria(ExModelo.class);
    }

    public List<ExVia> listarExVias() {
        return findByCriteria(ExVia.class);
    }

    public List<ExFormaDocumento> listarExFormasDocumento() {
        return findAndCacheByCriteria(CACHE_QUERY_HOURS, ExFormaDocumento.class);
    }

    public List<ExTipoDespacho> listarExTiposDespacho() {
        return findByCriteria(ExTipoDespacho.class);
    }

}