@Override
  protected ListagemResult<Usuario> getLista(WebRequestContext request, UsuarioFiltro filtro) {
    ListagemResult<Usuario> result = super.getLista(request, filtro);
    List<Usuario> listaUsuario = result.list();

    if (request.getRequestQuery().contains("util")) {
      StringBuilder ids = new StringBuilder();
      for (Usuario usuario : listaUsuario) {
        ids.append("'" + usuario.getNome() + "|" + usuario.getEmail() + "',");
      }
      if (ids.length() > 0) {
        ids.delete(ids.length() - 1, ids.length());
      }
      request.setAttribute("idsFormatados", ids.toString());
    }

    PlanoGestao planoGestaoAtual = planoGestaoService.obtemPlanoGestaoAtual();

    for (Usuario usuario : listaUsuario) {
      List<UnidadeGerencial> lista =
          unidadeGerencialService.loadByUsuarioPlanoGestao(usuario, planoGestaoAtual);
      if (lista != null && lista.size() > 0) {
        usuario.setUgsAtuais(CollectionsUtil.listAndConcatenate(lista, "sigla", ", "));
      }
    }
    return result;
  }
  @Override
  protected void entrada(WebRequestContext request, Usuario form) throws Exception {
    if (form.getId() == null) request.setAttribute("novo", true);
    // apenas se o usuario digitar que será verificado novamente
    form.setSenha(null);
    form.setVerificaSenha(null);

    // popular os perfis do usuario
    if (form.getId() != null) {
      form.setPapeis(usuarioPapelService.getPapeis(form));
    }
  }
  @Override
  protected void excluir(WebRequestContext request, Usuario bean) throws Exception {
    // Verifica se quem foi excluído é quem esta logado, se for invalida a sessão
    Usuario usuario = (Usuario) Neo.getUser();
    boolean invalidar = bean.getId().equals(usuario.getId()) ? true : false;

    super.excluir(request, bean);

    if (invalidar) {
      request.getSession().invalidate();
    }
  }
  @Override
  protected void validateBean(Usuario bean, BindException errors) {

    if (bean.getId() == null) {
      // esta validação não é feita no bean pq a regra de negocio permite na alteração
      // do usuario não alterar a senha
      if (bean.getSenha() == null || bean.getSenha().equals("")) {
        errors.reject("É necessário informar a senha.", "É necessário informar a senha.");
      }
    }

    if (bean.getId() == null) {
      if (!bean.getSenha().equals("")) {
        if (bean.getVerificaSenha() == null || bean.getVerificaSenha().equals("")) {
          errors.reject(
              "É necessário a confirmação da senha.", "É necessário a confirmação da senha.");
        }
        if (bean.getVerificaSenha() != null || !bean.getVerificaSenha().equals("")) {
          if (!bean.getSenha().equals(bean.getVerificaSenha())) {
            errors.reject("As senhas digitadas não conferem.", "As senhas digitadas não conferem.");
          } else {
            if (bean.getId() == null) {
              // criptogafrar a senha
              bean.setSenha(DigestUtils.md5Hex(bean.getSenha()));
            }
          }
        }
      }
    }
    // verificar se já existe o login informado
    if (!bean.getLogin().equals("") && bean.getId() == null) {
      Boolean existe = usuarioService.verificaExisteLogin(bean.getLogin());
      if (existe) {
        errors.reject(
            "Este login já existe. Favor informar outro.",
            "Este login já existe. Favor informar outro.");
      }
    }
    // se o usuario alterou o login verificar se este já existe
    if (!bean.getLogin().equals("") && bean.getId() != null) {
      Usuario usuario = usuarioService.obtemLogin(bean);
      if (!usuario.getLogin().equals("") && !bean.getLogin().equals(usuario.getLogin())) {
        Boolean existe = usuarioService.verificaExisteLogin(bean.getLogin());
        if (existe) {
          errors.reject(
              "Este login já existe. Favor informar outro.",
              "Este login já existe. Favor informar outro.");
        }
      }
    }

    if (bean.getPapeis() == null || bean.getPapeis().size() == 0) {
      errors.reject("É necessário pelo menos um perfil.", "É necessário pelo menos um perfil.");
    }

    if (bean.getFoto() != null && bean.getFoto().getSize() > 0) {
      if (bean.getFoto().getContent().length > 500000) {
        errors.reject(
            "O tamanho máximo permitido para o arquivo é 500kb.",
            "O tamanho máximo permitido para o arquivo é 500kb.");
      }
      // 400x500
      if (!"image/jpeg".equals(bean.getFoto().getContenttype())
          && !"image/jpg".equals(bean.getFoto().getContenttype())) {
        errors.reject(
            "O formato da imagem é inválido. É permitido apenas jpeg.",
            "O formato da imagem é inválido. É permitido apenas jpeg.");
      }

      try {
        BufferedImage image = ImageIO.read(new ByteArrayInputStream(bean.getFoto().getContent()));
        if (image != null && image.getWidth() > 400) {
          errors.reject(
              "O tamanho máximo permitido para o arquivo é de 400px de largura",
              "O tamanho máximo permitido para o arquivo é de 400px de largura");
        }
        if (image != null && image.getHeight() > 500) {
          errors.reject(
              "A tamanho máximo permitido para o arquivo é de 500px de altura",
              "O tamanho máximo permitido para o arquivo é de 500px de altura");
        }
      } catch (IOException e) {
        errors.reject("Não foi possível carregar a imagem", "Não foi possível carregar a imagem");
      }
    }
    super.validateBean(bean, errors);
  }