/** Removes all child nodes of the supplied root node. */
 private void removeAllChildsOfRootNode(final TreeNode rootNode) {
   if ((rootNode != null) && (rootNode.getChildCount() > 0)) {
     final TreeNode[] array =
         rootNode.getChildren().toArray(new TreeNode[rootNode.getChildCount()]);
     for (TreeNode child : array) {
       child.setParent(null);
       child = null;
     }
   }
 }
  private void updateNodeForSelected(final TreeNode treeNode, final TreeNode selectedTreeNode) {
    if ((selectedTreeNode != null) && (treeNode != null)) {
      if (treeNode == selectedTreeNode) {
        selectedTreeNode.setSelected(true);
      } else {
        treeNode.setSelected(false);
      }

      if (treeNode.getChildCount() != 0) {
        for (final TreeNode child : treeNode.getChildren()) {
          updateNodeForSelected(child, selectedTreeNode);
        }
      }
    }
  }
  private boolean possuiFilhoSelecionado(TreeNode node) {
    boolean possui = false;

    if (node.getChildCount() > 0) {
      for (TreeNode filho : node.getChildren()) {
        if (filho.isSelected()) {
          possui = true;
          break;
        } else {
          possui = possuiFilhoSelecionado(filho);
          if (possui) {
            break;
          }
        }
      }
    }
    return possui;
  }
  /**
   * 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;
  }