/**
   * Método que carrega a arvore para uma lista de permissoes
   *
   * @param permissoes - as permissoes a serem exibidas
   * @param permissoesParaSelecionar - as permissoes que ficarao selecionadas
   * @return
   */
  public TreeNode getTreeNode(
      List<Permissao> permissoes, List<Permissao> permissoesParaSelecionar) {
    TreeNode root = new DefaultTreeNode();
    root.setExpanded(true);

    Map<Permissao, TreeNode> nodeMap = new LinkedHashMap<Permissao, TreeNode>();

    // criar nó para cada permissao
    for (Permissao permissao : permissoes) {
      adicionarPermissaoAoMap(root, permissao, nodeMap, permissoes, permissoesParaSelecionar, true);
    }
    for (Map.Entry<Permissao, TreeNode> entry : nodeMap.entrySet()) {

      Permissao permissao = entry.getKey();
      TreeNode node = entry.getValue();
      if (permissao.getPermissaoPai() != null) {
        TreeNode parent = nodeMap.get(permissao.getPermissaoPai());
        // selecionar apenas ate o segundo nivel
        if (parent != null && parent.isSelected()) {
          node.setSelected(true);
        }
        node.setExpanded(false);
        if (parent != null) {
          parent.getChildren().add(node);
        } else {
          root.getChildren().add(node);
        }
      }
    }
    return root;
  }
  /**
   * Seta o campo CaminhoPermissao da Permissao. O formato eh permissao 1 > permissao 2 > permissao
   * 3
   *
   * @param listaPermissoes
   * @param adicionarPropriaPermissao Indica se o caminho deve ir ateh o final indicando a propria
   *     permissao
   */
  public void criarCaminhoPermissao(
      List<Permissao> listaPermissoes, boolean adicionarPropriaPermissao) {
    if (listaPermissoes != null) {
      for (Permissao permissao : listaPermissoes) {
        StringBuilder builder = new StringBuilder();

        List<Permissao> permissoes = new ArrayList<Permissao>();
        Permissao permissaoAtual = permissao;
        while (permissaoAtual != null) {
          permissoes.add(permissaoAtual);
          permissaoAtual = permissaoDAO.getInitialized(permissaoAtual.getPermissaoPai());
        }

        Collections.reverse(permissoes);
        for (int i = 0; i < permissoes.size(); i++) {
          if (adicionarPropriaPermissao == true || !permissoes.get(i).equals(permissao)) {
            if (i > 0) {
              builder.append(" > ");
            }
            if (permissoes.get(i).equals(permissao)) {
              builder
                  .append("<b style='font-size: 13px;'>")
                  .append(permissoes.get(i).getNomeMenuVerificado())
                  .append("</b>");
            } else {
              builder.append(permissoes.get(i).getNomeMenuVerificado());
            }
          }
        }
        permissao.setCaminhoPermissao(builder.toString());
      }
    }
  }
 public Integer getNivel(Permissao permissao) {
   Integer nivel = 0;
   if (permissao.getPermissaoPai() != null) {
     nivel = getNivel(permissao.getPermissaoPai()) + 1;
   }
   return nivel;
 }
 private List<Permissao> getChildren(List<Permissao> permissoes) {
   List<Permissao> permissoesAdd = new ArrayList<Permissao>();
   if (permissoes != null) {
     for (Permissao permissao : permissoes) {
       if (!permissoesAdd.contains(permissao)) {
         permissoesAdd.add(permissao);
       }
       permissao.getPermissoesFilhas().size();
       List<Permissao> children = getChildren(permissao.getPermissoesFilhas());
       if (children != null && !children.isEmpty()) {
         for (Permissao child : children) {
           if (!permissoesAdd.contains(child)) {
             permissoesAdd.add(child);
           }
         }
       }
     }
   }
   return permissoesAdd;
 }
 public void adicionarPermissaoAoMap(
     TreeNode root,
     Permissao permissao,
     Map<Permissao, TreeNode> nodeMap,
     List<Permissao> permissoes,
     List<Permissao> permissoesParaSelecionar,
     boolean selectable) {
   TreeNode node = new DefaultTreeNode(permissao, root);
   node.setExpanded(true);
   node.setSelectable(selectable);
   if (permissoesParaSelecionar != null && permissoesParaSelecionar.contains(permissao)) {
     node.setSelected(true);
   }
   nodeMap.put(permissao, node);
   if (permissao.getPermissaoPai() != null) {
     Permissao permissaoPai = permissaoDAO.getInitialized(permissao.getPermissaoPai());
     if (!permissoes.contains(permissaoPai) && nodeMap.get(permissaoPai) == null) {
       adicionarPermissaoAoMap(
           root, permissaoPai, nodeMap, permissoes, permissoesParaSelecionar, false);
     }
   }
 }
  public List<Permissao> pesquisarPermissao(String query, List<Permissao> listaPermissoes) {
    List<Permissao> permissoes = new ArrayList<Permissao>();

    if (listaPermissoes != null) {
      for (Permissao permissao : listaPermissoes) {
        if (permissao.isPossuiMenu()
            && permissao.getUrl() != null
            && !permissao.getUrl().isEmpty()) {
          if (Conversion.removeAccent(permissao.getCaminhoPermissao())
                  .toLowerCase()
                  .contains(Conversion.removeAccent(query.toLowerCase()))
              || (permissao.getNomeMenu() != null
                  && permissao.getNomeMenu().toLowerCase().contains(query.toLowerCase()))) {
            permissoes.add(permissao);
          }
        }
      }
    }

    CollectionsUtils.orderAsc(permissoes, "caminhoPermissao");

    return permissoes;
  }