/**
  * RECURSIVO! Converte a ArvoreSimples para o TreeNode do PrimeFaces. Na primeira chamada, o
  * segundo argumento deve ser nulo, simbolizando a raiz. O retorno da primeira chamada eh a raiz.
  */
 public TreeNode converterArvoreSimplesParaArvorePrime(
     ArvoreSimples arvore, TreeNode treeNode, boolean desabilitar, boolean expandir) {
   TreeNode arvorePrime = null;
   if (arvore != null) {
     arvorePrime =
         new DefaultTreeNode(
             new ChaveValor<String, String>(arvore.getChave(), arvore.getValor()), treeNode);
     arvorePrime.setExpanded(expandir);
     arvorePrime.setSelectable(!desabilitar);
     for (ArvoreSimples nivel : arvore.getFilhos()) {
       converterArvoreSimplesParaArvorePrime(nivel, arvorePrime, desabilitar, expandir);
     }
   }
   return arvorePrime;
 }
  /**
   * RECURSIVO! Converte o TreeNode do PrimeFaces para a ArvoreSimples Na primeira chamada, o
   * segundo argumento deve ser nulo, simbolizando a raiz. O retorno da primeira chamada eh a raiz.
   */
  public ArvoreSimples converterArvorePrimeParaArvoreSimples(
      TreeNode treeNode, ArvoreSimples arvore, boolean apenasSelecionados) {
    ChaveValor<String, String> chaveValor = (ChaveValor<String, String>) treeNode.getData();
    ArvoreSimples arvoreSimples = new ArvoreSimples(chaveValor.getChave(), chaveValor.getValor());

    if (arvore != null) { // -- da primeira vez nao tem pai, nas proximas eh a recursao dos filhos
      arvore.getFilhos().add(arvoreSimples);
    }

    if (treeNode.getChildCount() > 0) {
      for (TreeNode nivel : treeNode.getChildren()) {
        if (apenasSelecionados) {
          boolean possui = possuiFilhoSelecionado(nivel);
          if (!possui && !nivel.isSelected()) {
            continue;
          }
        }

        converterArvorePrimeParaArvoreSimples(nivel, arvoreSimples, apenasSelecionados);
      }
    }
    return arvoreSimples;
  }