protected boolean processRoles(
      HttpServletRequest request, HttpServletResponse response, ActionMapping mapping)
      throws IOException, ServletException {

    String role = null;

    ArrayList regras = new ArrayList();

    /*
     * Trecho responsável por pegar as regras de acesso definidas no Struts
     * Este tratamento foi feito para permitir/restringir acesso a mais de
     * uma opção por url. No caso Reclassificar Assunto e Mensagem através
     * da url reclassificar
     */
    if (mapping.getRoles() != null) {

      String[] roles = mapping.getRoles().split(",");

      for (int cont = 0; cont < roles.length; cont++) {

        try {

          new Long(roles[cont]);

        } catch (Exception e) {

          e.printStackTrace();
          throw new ServletException("Código de regra de acesso inválido.");
        }

        regras.add(roles[cont]);
        role = (String) regras.get(0); // Pega a primeira regra(role)
      }
    }

    OrgaoCtrl orgaoCtrl = new OrgaoCtrl(daoFactory);

    /* Não existe bloqueio para esta acão */
    if (role == null || role.trim().length() == 0) {
      return true;
    }

    request.setAttribute(Constants.SR_FUNCIONALIDADE, role);

    /*Coloca a funcionalidade na sessão para
     * ser recuperada na tela de ajuda
     */
    request.getSession().setAttribute(Constants.SR_FUNCIONALIDADE, role);

    ControleAcessoCtrl controleAcessoCtrl = new ControleAcessoCtrl(daoFactory);

    Orgao orgao =
        orgaoCtrl.get((String) request.getSession().getAttribute(Constants.ID_SESSAO_ORGAO));

    /* verifico a vigência do órgão para acionamento e consulta resposta */
    String redirect = null;

    int vigenciaOrgao = controleAcessoCtrl.verificaVigenciaOrgao(orgao, role);

    switch (vigenciaOrgao) {
      case ControleAcessoCtrl.VG_FORA_PERIODO_ACIONAMENTO:
        redirect = Constants.CAD_ACNMNT_FORA_VIGENCIA_PAGE;
        break;
      case ControleAcessoCtrl.VG_FORA_PERIODO_CONSULTA_RESPOSTA:
        redirect = Constants.CON_RESPTA_FORA_VIGENCIA_PAGE;
        break;
      case ControleAcessoCtrl.VG_FORA_PERIODO_OPERACAO:
        redirect = Constants.CAD_OPERACAO_FORA_VIGENCIA_PAGE;
        break;
      default:
        // DO NOTHING
    }

    if (redirect != null) {

      controleAcessoCtrl = null;

      /* retiro o controle do struts */
      doForward(redirect, request, response);
      return false;
    }

    /* verifico o acesso do funcionario ao sistema */
    int possuiAcesso = ControleAcessoCtrl.CA_NECESSARIO_LOGIN;

    try {

      Long funcionarioId = (Long) request.getSession().getAttribute(Constants.PA_FUNCIONARIO);

      FuncionarioCtrl funcionarioCtrl = new FuncionarioCtrl(daoFactory);

      Funcionario funcionario = (Funcionario) funcionarioCtrl.get(funcionarioId);

      possuiAcesso = controleAcessoCtrl.permiteAcesso(orgao, funcionario, regras);

    } catch (DaoException e) {
      System.out.println(e.getMessage());
      e.printStackTrace();

      throw new ServletException(e);
    }

    redirect = Constants.LOGIN_ACTION;

    switch (possuiAcesso) {
      case ControleAcessoCtrl.CA_ACESSO_PERMITIDO:
        request.getSession().setAttribute(Constants.SR_FUNCIONALIDADES, regras);
        return true;
      case ControleAcessoCtrl.CA_ACESSO_NEGADO:
        redirect = Constants.DENIED_ACCESS_ACTION;
        break;
      case ControleAcessoCtrl.CA_NECESSARIO_LOGIN:
        redirect = Constants.LOGIN_ACTION;
        break;
      case ControleAcessoCtrl.VG_FORA_PERIODO_OPERACAO:
        redirect = Constants.CAD_OPERACAO_FORA_VIGENCIA_PAGE;
        break;
      default:
        redirect = Constants.LOGIN_ACTION;
    }

    controleAcessoCtrl = null;

    /* retiro o funcionario da sessão */
    request.getSession().removeAttribute(Constants.PA_FUNCIONARIO);

    /* retiro o controle do struts */
    doForward(redirect, request, response);

    return false;
  }