@RequestMapping(value = "arquivo/buscar", method = RequestMethod.GET)
  public String buscaArquivo(HttpServletRequest request) {

    Collection<Tipo> tipos = tipoService.findByCriterion();
    request.setAttribute("tipos", tipos);

    Collection<Caixa> caixas = caixaService.findByCriterion();
    request.setAttribute("caixas", caixas);

    return "arquivo/buscar";
  }
  @RequestMapping(
      value = "arquivo/buscarSubmit",
      method = {RequestMethod.POST, RequestMethod.GET})
  public String buscarSubmit(
      String pessoa,
      String dataArquivoInicio,
      String dataArquivoFim,
      Long tipo,
      Long caixa,
      String assunto,
      HttpServletRequest request) {
    buscaArquivo(request);
    request.setAttribute("pessoa", pessoa);
    request.setAttribute("dataArquivoInicio", dataArquivoInicio);
    request.setAttribute("dataArquivoFim", dataArquivoFim);
    request.setAttribute("tipo", tipo);
    request.setAttribute("caixa", caixa);
    request.setAttribute("assunto", assunto);

    Collection<Criterion> criterios = new ArrayList<Criterion>();

    if (StringUtils.hasText(pessoa)) {
      criterios.add(Criterion.like("pessoa.nome", pessoa));
    }

    Tipo t = tipoService.find(tipo);
    if (t != null) {
      criterios.add(Criterion.equal("tipo", t));
    }

    Caixa c = caixaService.find(caixa);
    if (c != null) {
      criterios.add(Criterion.equal("caixa", c));
    }

    if (StringUtils.hasText(dataArquivoInicio) && dataArquivoInicio != null) {
      Date dataInicio, dataFim;
      try {
        dataInicio = DateUtil.converteDataDDMMAAAA(dataArquivoInicio);
        dataFim = DateUtil.converteDataDDMMAAAA(dataArquivoFim);

        if (dataInicio.after(dataFim)) {
          request.setAttribute("erro", "A data final não pode ser menor do que a inicial");
          return buscaArquivo(request);
        }

        criterios.add(Criterion.between("dataArquivo", dataInicio, dataFim));

      } catch (ParseException e) {
        // data invalida
        request.setAttribute(
            "erro",
            "Não foi possível atribuir o período de datas. Digite as datas no formato dd/mm/aaaa");
        return buscaArquivo(request);
      }
    }

    if (StringUtils.hasText(assunto)) {
      criterios.add(Criterion.like("assunto", assunto));
    }

    Collection<Arquivo> arquivos =
        arquivoService.findByCriterion(criterios.toArray(new Criterion[0]));
    request.setAttribute("arquivos", arquivos);

    return "arquivo/buscado";
  }